LeetCode二叉树的层序遍历系列问题总结(队列实现)

层序遍历:从根节点开始,从上到下,从左到右访问每一个节点。

二叉树节点定义:

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

层序遍历:用队列实现。

具体操作:根节点入队;while循环判断队列不空时,弹出一个节点,访问它,并把它的左右孩子节点入队(父亲节点出队,儿子节点入队)。有点花木兰代父从军的意思哈。

最简单的层序遍历模板:

public void levelOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        Queue queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode cur = queue.poll();
            System.out.println(cur.val);
            if (cur.left != null) {
                queue.offer(cur.left);
            }
            if (cur.right != null) {
                queue.offer(cur.right);
            }
        }
    }

解答LeetCode102、107、103、199题,只需要在上面的模板进行修改。

102. Binary Tree Level Order Traversal

题目地址:https://leetcode.com/problems/binary-tree-level-order-traversal/description/

根据题目要求我们需要知道遍历时的层数,也就是说,需要知道每层有多少个节点,而队列的size()就是这个队列里面的节点数量,每次进入while循环的时候通过queue.size()就可以得到这一层的节点数,然后遍历这些节点就可以了。

class Solution {
    public List> levelOrder(TreeNode root) {
        List> res = new ArrayList<>();
        if(root == null){
            return res;
        }
        Queue queue = new LinkedList();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            List list = new ArrayList();
            for(int i=0;i

107. Binary Tree Level Order Traversal II

题目地址:https://leetcode.com/problems/binary-tree-level-order-traversal-ii/description/

这一题的层是从下到上的,只需要改变res.add(E e)方式,改为res.add(int index,E e);具体的这两个方法有什么不同可以参考Java的APIhttps://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ArrayList.html

class Solution {
    public List> levelOrderBottom(TreeNode root) {
        List> res = new ArrayList<>();
        if(root == null ){
            return res;
        }
        Queue queue = new LinkedList();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            List list = new ArrayList();
            for(int i=0;i

103. Binary Tree Zigzag Level Order Traversal

题目地址:https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/description/

“之”字型层序遍历,有了上面两个题的基础,这个题很好解决,只需要记录一下层数,分情况使用ArrayList.add(E e)和ArrayList.add(int index,E e)即可解决。

class Solution {
    public List> zigzagLevelOrder(TreeNode root) {
        List> res = new ArrayList<>();
        if(root == null ){
            return res;
        }
        Queue queue = new LinkedList();
        queue.offer(root);
        int level = 0;
        while(!queue.isEmpty()){
            int size = queue.size();
            List list = new ArrayList();
            for(int i=0;i

199. Binary Tree Right Side View

题目地址:https://leetcode.com/problems/binary-tree-right-side-view/description/

二叉树的右视图,层序遍历,只将每层最后一个节点的值添加ArrayList中返回。

class Solution {
    public List rightSideView(TreeNode root) {
        List res = new ArrayList<>();
        if(root == null){
            return res;
        }
        Queue queue = new LinkedList();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            List list = new ArrayList();
            for(int i=0;i

 

你可能感兴趣的:(LeetCode,LeetCode--Java版)