递归
class Solution {public List preorderTraversal(TreeNode root) {List list = new ArrayList<>();dfs(root,list);return list;}public static void dfs(TreeNode root,List list){if(root == null){return;}//中 左 右list.add(root.val);dfs(root.left,list);dfs(root.right,list);}
}
迭代
我们使用栈来进行迭代,过程如下:
由于栈是“先进后出”的顺序,所以入栈时先将右子树入栈,这样使得前序遍历结果为 “根->左->右”的顺序。
// 前序遍历顺序:中-左-右,入栈顺序:中-右-左
class Solution {public List preorderTraversal(TreeNode root) {List list = new ArrayList<>();if(root == null){return list;}Stack stack = new Stack<>();stack.push(root);while(!stack.isEmpty()){TreeNode node = stack.pop();list.add(node.val);if(node.right != null){stack.push(node.right);}if(node.left != null){stack.push(node.left);}}return list;}
}
递归
class Solution {public List inorderTraversal(TreeNode root) {List list = new ArrayList<>();dfs(root,list);return list;}public static void dfs(TreeNode root,List list){if(root == null){return;}//左 中 右dfs(root.left,list);list.add(root.val);dfs(root.right,list);}
}
迭代
会先递归节点A,再递归B,再递归D,一个个压入递归栈。
中序遍历,在栈顶节点的右子节点压栈之前,要处理出栈节点的节点值,将它输出。
新入栈的右子节点(右子树),就是在递归它。和节点A、B、D的压栈一样,它们都是子树。
不同的子树要做同样的事情,一样要先将它的左子节点不断压栈,然后再出栈,带出右子节点入栈。
代码实现
// 中序遍历顺序: 左-中-右 入栈顺序: 左-右
class Solution {public List inorderTraversal(TreeNode root) {List result = new ArrayList<>();if (root == null){return result;}Stack stack = new Stack<>();TreeNode cur = root;while (cur != null || !stack.isEmpty()){if (cur != null){stack.push(cur);cur = cur.left;}else{cur = stack.pop();result.add(cur.val);cur = cur.right;}}return result;}
}
递归
class Solution {public List postorderTraversal(TreeNode root) {List list = new ArrayList<>();dfs(root,list);return list;}public static void dfs(TreeNode root,List list){if(root == null){return;}//左 右 中dfs(root.left,list);dfs(root.right,list);list.add(root.val);}
}
迭代
根据前序遍历改
前序遍历中左右—>中右左—>左右中(翻转)
class Solution {public List postorderTraversal(TreeNode root) {List list = new ArrayList<>();if(root == null){return list;}Stack stack = new Stack<>();stack.push(root);while(!stack.isEmpty()){TreeNode node = stack.pop();list.add(node.val);if(node.left != null){stack.push(node.left);}if(node.right != null){stack.push(node.right);}}Collections.reverse(list);return list;}
}
上一篇:隐私计算概览
下一篇:react-jwchat