栈实现二叉树迭代遍历
前序,中序,后序通用
public List<Integer> postorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); Deque<TreeNode> stack = new LinkedList<>(); if(root != null){ stack.push(root); } while(!stack.isEmpty()){ TreeNode cur = stack.pop(); if(cur != null){ //这里是后序遍历左,右,根, //由于最后处理根,则需要最先入栈 stack.push(cur); //cur后空结点随之入栈,标识已经访问过,但还没有被处理(还可以进行额外操作) stack.push(null); //根据前中后顺序的不同,改变cur,left,righ的入栈顺序即可 if(cur.right != null) stack.push(cur.right); if(cur.left != null) stack.push(cur.left); }else{ res.add(stack.pop().val); } } return res; }
普通迭代
//前序 public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new LinkedList<>(); if (root == null) return res; Deque<TreeNode> stack = new LinkedList<>(); TreeNode cur = root; while (cur != null || !stack.isEmpty()) { if (cur != null) { res.add(cur.val); stack.push(cur.right); cur = cur.left; } else cur = stack.pop(); } return res; } //中序 public List<Integer> inorderTraversal(TreeNode root) { Deque<TreeNode> stack = new LinkedList<>(); List<Integer> list = new LinkedList<>(); if (root == null) return list; TreeNode cur = root; while (cur != null || !stack.isEmpty()) { if (cur != null) { stack.push(cur); cur = cur.left; } else { cur = stack.pop(); list.add(cur.val); cur = cur.right; } } return list; } //后序 public List<Integer> postorderTraversal(TreeNode root) { List<Integer> res = new LinkedList<>(); Deque<TreeNode> stack = new LinkedList<>(); TreeNode cur = root, pre = null; while (cur != null || !stack.isEmpty()) { if (cur != null) { stack.push(cur); cur = cur.left; } else { cur = stack.peek(); // 右孩子为空或者访问过了 if (cur.right == null || cur.right == pre) { res.add(cur.val); stack.pop(); pre = cur; cur = null; } else cur = cur.right; } } return res; }
下一篇:
微分算子法,拉普拉斯变换与卷积