代码随想录-2023/07/11

200 阅读1分钟

二叉树的遍历-递归法 && 迭代法

144.二叉树的前序遍历

  1. 递归法
  2. 迭代法---用栈模拟, 根右左的入栈顺序

代码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.二叉树的中序遍历

  1. 递归法
  2. 迭代法---借用指针遍历所有节点

代码-递归:

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. 递归遍历
  2. 迭代遍历---入栈顺序:根-左-右

代码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;
    }
    
}