二叉树遍历系列解法总结

遍历系列

144. 二叉树的前序遍历

题目描述:

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

输入:root = [1,null,2,3]输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

输入:root = [1,2]输出:[1,2]

示例 5:

输入:root = [1,null,2]输出:[1,2]

提示:

树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100

进阶:递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

//递归
class Solution {
    
    
    public List<Integer> preorderTraversal(TreeNode root) {
    
    
        List<Integer> arr = new ArrayList<Integer>();
        preorder(root, arr);
        return arr;
    }

    public void preorder(TreeNode root, List<Integer> arr) {
    
    
        if (root == null) return;
        arr.add(root.val);
        preorder(root.left, arr);
        preorder(root.right, arr);
    }
}


//迭代:写法一
class Solution {
    
    
    public List<Integer> preorderTraversal(TreeNode root) {
    
    
        List<Integer> arr = new ArrayList<Integer>();
        if (root == null) return arr;

        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode cur = root;
        while (!stack.isEmpty() || cur != null) {
    
    
            while (cur != null) {
    
    
                arr.add(cur.val);
                stack.push(cur);
                cur = cur.left;
            }
            cur = stack.pop();
            cur = cur.right;
        }
        return arr;
    }
}


//迭代:写法二
class Solution {
    
    
    public List<Integer> preorderTraversal(TreeNode root) {
    
    
        List<Integer> list = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        
        while (root! = null || !stack.isEmpty()) {
    
    
            if (root != null) {
    
    
                list.add(root.val);//步骤一,取根节点的值
                stack.push(root);//把根节点放入栈中
                root = root.left;//步骤二,遍历左子树
            } else {
    
    
                TreeNode tem = stack.pop();
                root = tem.right;//步骤三,遍历右子树
            }
        }
        return list;
    }
}


//迭代:写法三
class Solution {
    
    
    public List<Integer> preorderTraversal(TreeNode root) {
    
    
        List<Integer> arr = new ArrayList<>();
        if (root == null) return arr;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()) {
    
    
            TreeNode cur = stack.pop();
            arr.add(cur.val);
            if (cur.right != null) {
    
    
                stack.push(cur.right);
            }
            if (cur.left != null) {
    
    
                stack.push(cur.left);
            }
        }
        return arr;
    }
}

94. 二叉树的中序遍历

题目描述:

给定一个二叉树的根节点 root ,返回它的 中序 遍历。

示例 1:

输入:root = [1,null,2,3]输出:[1,3,2]

示例 2:

输入:root = []
输出:[]
示例 3:

输入:root = [1]
输出:[1]
示例 4:

输入:root = [1,2]输出:[2,1]

示例 5:

输入:root = [1,null,2]输出:[1,2]

提示:

树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

//递归
class Solution {
    
    
    public List<Integer> inorderTraversal(TreeNode root) {
    
    
        List<Integer> arr = new ArrayList<>();
        inorder(root, arr);
        return arr;
    }

    public void inorder(TreeNode root, List<Integer> arr) {
    
    
        if (root == null) return;
        inorder(root.left, arr);
        arr.add(root.val);
        inorder(root.right, arr);
    }
}


//迭代:写法一
class Solution {
    
    
    public List<Integer> inorderTraversal(TreeNode root) {
    
    
        List<Integer> arr = new ArrayList<>();
        if (root == null) return arr;

        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while (!stack.isEmpty() || cur != null) {
    
    
            while (cur != null) {
    
    
                stack.push(cur);
                cur = cur.left;
            }
            cur = stack.pop();
            arr.add(cur.val);
            cur = cur.right;
        }
        return arr;
    }
}


//迭代:写法二
class Solution {
    
    
    public List<Integer> inorderTraversal(TreeNode root) {
    
    
        List<Integer> list = new ArrayList<>();
        Stack<TreeNode> stack =n ew Stack<>();
        
        while (root != null || !stack.isEmpty()) {
    
    
            if (root != null) {
    
    
                stack.push(root);//把根节点放入栈中
                root=root.left;//步骤一,遍历左子树
            } else {
    
    
                TreeNode tem = stack.pop();
                list.add(tem.val);//步骤二,取根结点的值
                root = tem.right;//步骤三,遍历右子树
            }
        }
        return list;
    }
}

145. 二叉树的后序遍历

题目描述:

在这里插入图片描述
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

//递归
class Solution {
    
    
    public List<Integer> postorderTraversal(TreeNode root) {
    
    
        List<Integer> arr = new ArrayList<>();
        postorder(root, arr);
        return arr;
    }

    public void postorder(TreeNode root, List<Integer> arr) {
    
    
        if (root == null) return;
        postorder(root.left, arr);
        postorder(root.right, arr);
        arr.add(root.val);
    }
}


//迭代:写法一
class Solution {
    
    
    public List<Integer> postorderTraversal(TreeNode root) {
    
    
        List<Integer> res = new ArrayList<Integer>();
        if (root == null) return res;
        
        Deque<TreeNode> stack = new LinkedList<TreeNode>();
        TreeNode prev = null;
        while (root != null || !stack.isEmpty()) {
    
    
            while (root != null) {
    
    
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            if (root.right == null || root.right == prev) {
    
    
                res.add(root.val);
                prev = root;
                root = null;
            } else {
    
    
                stack.push(root);
                root = root.right;
            }
        }
        return res;
    }
}


//迭代法:写法二
class Solution {
    
    
    public List<Integer> postorderTraversal(TreeNode root) {
    
    
        List<Integer> list = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        
        while (root != null || !stack.isEmpty()) {
    
    
            if (root != null) {
    
    
             stack.push(root);//把根节点放入栈中
             list.add(0, root.val);//步骤一,在index=0处插入根结点的值
             root = root.right;//步骤二,遍历右子树
            } else {
    
    
                TreeNode tem = stack.pop();
                root = tem.left;//步骤三,遍历左子树
            }
        }
        return list;
    }
}

DFS 遍历使用递归:

void DFS(TreeNode root) {
    
    
    if (root == null) return;
    DFS(root.left);
    DFS(root.right);
}

BFS 遍历使用队列数据结构:

void BFS(TreeNode root) {
    
    
    Queue<TreeNode> queue = new ArrayDeque<>();
    queue.offer(root);
    while (!queue.isEmpty()) {
    
    
        TreeNode cur = queue.poll();
        if (cur.left != null) 
            queue.offer(cur.left);
        if (cur.right != null)
            queue.offer(cur.right);
    }
}

102. 二叉树的层序遍历

题目描述:

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

在这里插入图片描述

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    
    
    public List<List<Integer>> levelOrder(TreeNode root) {
    
    
        List<List<Integer>> arr = new ArrayList<List<Integer>>();
        if (root == null) return arr;

        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while (!queue.isEmpty()) {
    
    
            List<Integer> ans = new ArrayList<Integer>();;
            int n = queue.size();
            for (int i = 0; i < n; i++) {
    
    
                TreeNode cur = queue.poll();
                ans.add(cur.val);
                if (cur.left != null) {
    
    
                    queue.offer(cur.left);
                }
                if (cur.right != null) {
    
    
                    queue.offer(cur.right);
                }
            }
            arr.add(ans);
        }
        return arr;
    }
}

103. 二叉树的锯齿形层序遍历

题目描述:

给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:
给定二叉树 [3,9,20,null,null,15,7],
在这里插入图片描述

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    
    
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
    
    
        List<List<Integer>> arr = new LinkedList<List<Integer>>();
        if (root == null) return arr;
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        boolean leftToRight = true;
        while (!queue.isEmpty()) {
    
    
            Deque<Integer> deque = new LinkedList<Integer>();
            int len = queue.size();
            for (int i = 0; i < len; i++) {
    
    
                TreeNode node = queue.poll();
                if (leftToRight) {
    
    
                    deque.offerLast(node.val);
                } else {
    
    
                    deque.offerFirst(node.val);
                }
                if (node.left != null) {
    
    
                    queue.offer(node.left);
                }
                if (node.right != null) {
    
    
                    queue.offer(node.right);
                }
            }
            arr.add(new LinkedList<Integer>(deque));
            leftToRight = !leftToRight;
        }
        return arr;
    }
}

107. 二叉树的层序遍历 II

题目描述:

给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

例如:
给定二叉树 [3,9,20,null,null,15,7],
在这里插入图片描述

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
//


//将二叉树结点插入到队列的首位, 对应最后输出
class Solution {
    
    
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
    
    
        LinkedList<List<Integer>> arr = new LinkedList<List<Integer>>();
        if (root == null) return arr;
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while (!queue.isEmpty()) {
    
    
            List<Integer> ans = new LinkedList<Integer>();
            int len = queue.size();
            for (int i = 0; i < len; i++) {
    
    
                TreeNode cur = queue.poll();
                ans.add(cur.val);
                if (cur.left != null) {
    
    
                    queue.offer(cur.left);
                }
                if (cur.right != null) {
    
    
                    queue.offer(cur.right);
                }
            }
            arr.addFirst(ans);
        }
        return arr;
    }
}


//还可以写成这样, arr.addFirst(ans) 相当于arr.add(0, ans)
class Solution {
    
    
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
    
    
        List<List<Integer>> arr = new LinkedList<List<Integer>>();
        if (root == null) return arr;
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while (!queue.isEmpty()) {
    
    
            List<Integer> ans = new LinkedList<Integer>();
            int len = queue.size();
            for (int i = 0; i < len; i++) {
    
    
                TreeNode cur = queue.poll();
                ans.add(cur.val);
                if (cur.left != null) {
    
    
                    queue.offer(cur.left);
                }
                if (cur.right != null) {
    
    
                    queue.offer(cur.right);
                }
            }
            arr.add(0, ans);
        }
        return arr;
    }
}


//C++中可以直接用翻转函数解决reverse(ans.begin(), ans.end()); 

猜你喜欢

转载自blog.csdn.net/weixin_43356538/article/details/114276157