先序遍历
-
递归实现
List<Integer> res = new ArrayList<>(); public List<Integer> preorderTraversal(TreeNode root) { if (root != null) { res.add(root.val); preorderTraversal(root.left); preorderTraversal(root.right); } return res; }
-
非递归实现
public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); while (!stack.isEmpty() || root != null) { if (root != null) { list.add(root.val); // 只需在这里加入list即可 stack.add(root); root = root.left; } else { TreeNode temp = stack.pop(); root = temp.right; } } return list; }
中序遍历
-
递归实现
List<Integer> res = new ArrayList<>(); public List<Integer> inorderTraversal(TreeNode root) { if (root != null) { inorderTraversal(root.left); res.add(root.val); inorderTraversal(root.right); } return res; }
-
非递归实现
public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); while (!stack.isEmpty() || root != null) { if (root != null) { stack.push(root); root = root.left; } else { TreeNode temp = stack.pop(); list.add(temp.val); root = temp.right; } } return list; }
后序遍历
-
递归实现
List<Integer> res = new ArrayList<>(); public List<Integer> postorderTraversal(TreeNode root) { if (root != null) { postorderTraversal(root.left); postorderTraversal(root.right); res.add(root.val); } return res; }
-
非递归实现
public List<Integer> postorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); if (root == null) return res; Stack<TreeNode> stack = new Stack<>(); TreeNode prev = null; // 指向刚被访问过的节点 while (!stack.isEmpty() || root != null) { while (root != null) { // 先走到最左边为null的节点 stack.push(root); root = root.left; } root = stack.pop(); if (root.right == null || root.right == prev) { // 如果root的右子树为空或者右节点刚被访问过则访问root节点 res.add(root.val); prev = root; // 记录下刚被访问过的节点 root = null; } else { // 否则先访问右子树 stack.push(root); root = root.right; } } return res; }