classSolution_144_0{ //递归解法 ArrayList<Integer> res = new ArrayList<>(); public List<Integer> preorderTraversal(TreeNode root){ if (root!=null){ res.add(root.val); if (root.left!=null) preorderTraversal(root.left); //前序遍历:根左右 if (root.right!=null) preorderTraversal(root.right); } return res; } }
classSolution_144_1{ //迭代解法 public List<Integer> preorderTraversal(TreeNode root){ if (root==null) returnnew ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); // 用队列来保存节点,顺序是根左右 ArrayList<Integer> res = new ArrayList<>(); // 保存节点值
stack.push(root); // 添加根 while (!stack.isEmpty()){ TreeNode node = stack.pop(); //弹出栈顶元素 res.add(node.val); // 添加值 if (node.right!=null) stack.push(node.right); // 因为是前序遍历,所以添加完根之后去添加左子树 if (node.left!=null) stack.push(node.left); // 因为是stack结构,所以右子树先add,放在栈下,左子树放在栈顶 } return res; } }
classSolution_94_0{ // 中序遍历 递归做法 ArrayList<Integer> res = new ArrayList<>(); public List<Integer> inorderTraversal(TreeNode root){ if (root!=null){ if (root.left!=null) inorderTraversal(root.left); // 中序遍历:左根右 先将左子树全部遍历 res.add(root.val); if (root.right!=null) inorderTraversal(root.right); } return res; } }
classSolution_94_1{ // 中序遍历 迭代做法 public List<Integer> inorderTraversal(TreeNode root){ if (root==null) returnnew ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); ArrayList<Integer> res = new ArrayList<>();
TreeNode cur = root; // 当前节点为root while (!stack.isEmpty() || cur!=null){ while (cur!=null){ stack.push(cur); // 如果当前节点不为null,则押入栈中 cur = cur.left; // 并且更新cur节点为当前节点的左子节点 } cur = stack.pop(); // 到达树的最左叶子时,弹出叶子,res添加当前节点的值 res.add(cur.val); cur = cur.right; // 检查当前节点是否有右节点,如果没有则下次循环弹出当前节点的父节点 } return res; } }
classSolution_145_0{ // 后序遍历 递归做法 ArrayList<Integer> res = new ArrayList<>(); public List<Integer> inorderTraversal(TreeNode root){ if (root!=null){ if (root.left!=null) inorderTraversal(root.left); if (root.right!=null) inorderTraversal(root.right); res.add(root.val); } return res; } }
classSolution_145_1{ // 后序遍历 迭代做法 public List<Integer> postorderTraversal(TreeNode root){ List<Integer> list = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); TreeNode cur = root; TreeNode last = null; while (cur != null || !stack.isEmpty()) { if (cur != null) { stack.push(cur); cur = cur.left; } else { TreeNode temp = stack.peek(); //是否变到右子树 if (temp.right != null && temp.right != last) { cur = temp.right; } else { list.add(temp.val); last = temp; stack.pop(); } } } return list; } }
classSolution_145_2{ // 后序遍历 抖机灵做法 // 利用LinkedList的addFirts方法,每次添加到在队首添加,最后顺序是:左右根 public List<Integer> postorderTraversal(TreeNode root){ if (root==null) returnnew ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); LinkedList<Integer> res = new LinkedList<>()<>();
stack.push(root); while (!stack.isEmpty()){ TreeNode node = stack.pop(); res.addFirst(node.val); // 每次添加到队首,所以根被排到最后 if (root.left!=null) stack.push(node.left); // 左节点押入栈底 if (root.right!=null) stack.push(node.right); // 右节点先弹出 } return res; } }