二叉树的遍历-递归法 && 迭代法
144.二叉树的前序遍历
- 递归法
- 迭代法---用栈模拟, 根右左的入栈顺序
代码1-递归法:
class Solution {
List<Integer> list = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
dfs(root);
return list;
}
public void dfs(TreeNode root){
if(root == null) return;
list.add(root.val);
dfs(root.left);
dfs(root.right);
}
}
代码2-迭代法:
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root == null) return list;
// 迭代法 - 用栈模拟
Deque<TreeNode> deque = new ArrayDeque<>();
deque.push(root);
while(!deque.isEmpty()){
TreeNode t = deque.pop();
list.add(t.val);
if(t.right != null) deque.push(t.right);
if(t.left != null) deque.push(t.left);
}
return list;
}
}
94.二叉树的中序遍历
- 递归法
- 迭代法---借用指针遍历所有节点
代码-递归:
class Solution {
List<Integer> list = new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
dfs(root);
return list;
}
public void dfs(TreeNode root){
if(root == null) return;
dfs(root.left);
list.add(root.val);
dfs(root.right);
}
}
代码-迭代:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root == null) return list;
Deque<TreeNode> deque = new ArrayDeque<>();
TreeNode curr = root;
while(curr != null || !deque.isEmpty()) {
if(curr != null) {
deque.push(curr);
curr = curr.left;
}else {
// 弹出根节点
curr = deque.pop();
list.add(curr.val);
curr = curr.right;
}
}
return list;
}
}
145.二叉树的后序遍历
- 递归遍历
- 迭代遍历---入栈顺序:根-左-右
代码1-递归遍历:
class Solution {
List<Integer> list = new ArrayList<>();
public List<Integer> postorderTraversal(TreeNode root) {
dfs(root);
return list;
}
public void dfs(TreeNode root) {
if(root == null) return;
dfs(root.left);
dfs(root.right);
list.add(root.val);
}
}
代码2-迭代遍历:
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
ArrayList<Integer> list = new ArrayList<>();
if(root == null) return list;
Deque<TreeNode> deque = new ArrayDeque<>();
deque.push(root);
while(!deque.isEmpty()) {
TreeNode t = deque.pop();
list.add(t.val);
if(t.left != null) deque.push(t.left);
if(t.right != null) deque.push(t.right);
}
Collections.reverse(list);
return list;
}
}