144. 二叉树的前序遍历(递归)
public List<Integer> preorderTraversal(TreeNode root) { List<Integer> ans = new ArrayList<>(); preOrder(root, ans); return ans; } //节点和结果数组为参数 //返回下一个要返回的节点 返回void 仅打印 //如果返回的节点为空,则终止 public void preOrder(TreeNode treeNode, List<Integer> ans) { if (treeNode == null) { return; } else { ans.add(treeNode.val); preOrder(treeNode.left, ans); preOrder(treeNode.right, ans); } }
145. 二叉树的后序遍历(递归)
public List<Integer> postorderTraversal(TreeNode root) { List<Integer> ans = new ArrayList<>(); postOrder(root, ans); return ans; } public void postOrder(TreeNode treeNode, List<Integer> ans) { if (treeNode == null) { return; } else { postOrder(treeNode.left, ans); postOrder(treeNode.right, ans); ans.add(treeNode.val); } }
94. 二叉树的中序遍历(递归)
public List<Integer> inorderTraversal(TreeNode root) { List<Integer> ans = new ArrayList<>(); inOrder(root, ans); return ans; } public void inOrder(TreeNode treeNode, List<Integer> ans) { if (treeNode == null) { return; } else { inOrder(treeNode.left, ans); ans.add(treeNode.val); inOrder(treeNode.right, ans); } }
144. 二叉树的前序遍历(栈)
List<Integer> ans = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); if (root == null) { return ans; } while (root != null || !stack.isEmpty()) { while (root != null) { stack.push(root); ans.add(root.val); root = root.left; } TreeNode peek = stack.peek(); stack.pop(); root = peek.right; } return ans;
94. 二叉树的中序遍历(栈)
public List<Integer> inorderTraversal(TreeNode root) { List<Integer> ans = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); if (root == null) { return ans; } while (root != null || !stack.isEmpty()) { while (root != null) { stack.push(root); root = root.left; } TreeNode peek = stack.peek(); stack.pop(); ans.add(peek.val); root = peek.right; } return ans; }
145. 二叉树的后序遍历(栈)
//存放遍历的结果List List<Integer> ans = new ArrayList<>(); //pre表示遍历时前面一个已经遍历过的结点 TreeNode pre = null; Stack<TreeNode> stack = new Stack<>(); //如果栈中还有元素,或者当前结点t非空 while (!stack.isEmpty() || root != null) { //顺着左子树走 并且将所有的元素压入栈中 while (root != null) { stack.push(root); root = root.left; } //当没有任何元素可以压栈的时候 //拿栈顶元素,注意这里并不将栈顶元素弹出 //因为在迭代时,根结点需要遍历两次,这里需要判断一下 //右子树是否遍历完毕 root = stack.peek(); ///如果要遍历当前结点,需要确保右子树已经遍历完毕 //如果当前结点右子树为空,那么右子树没有遍历的必要 //需要将当前结点放到ans中 //当t.right== pre时,说明右子树已经被打印过了 //那么此时需要将当前结点放到ans中 if (root.right == null || root.right == pre) { ///右子树已经遍历完毕,放到ans中 ans.add(root.val); // 弹栈 stack.pop(); //因为已经遍历了当前结点,所以需要更新pre结点pre pre = root; //已经打印完毕。需要设置为空,否则下一轮循环 //还会遍历t的左子树。 root = null; } else { //第一次走到t结点,不能放到ans中,因为t的右子树还没有遍历 //需要将t结点的右子树遍历 root = root.right; } } return ans;