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<TreeNode> 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<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null){
            return res;
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            List<Integer> list = new ArrayList<Integer>();
            for(int i=0;i<size;i++){
                TreeNode cur = queue.poll();
                list.add(cur.val);
                if(cur.left!=null){
                    queue.offer(cur.left);
                }
                if(cur.right!=null){
                    queue.offer(cur.right);
                }
            }
            res.add(list);
        }
        return res;
    }
}

107. Binary Tree Level Order Traversal II

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

扫描二维码关注公众号,回复: 3560139 查看本文章

这一题的层是从下到上的,只需要改变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<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null ){
            return res;
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            List<Integer> list = new ArrayList<Integer>();
            for(int i=0;i<size;i++){
                TreeNode cur = queue.poll();
                list.add(cur.val);
                if(cur.left!=null){
                    queue.offer(cur.left);
                }
                if(cur.right!=null){
                    queue.offer(cur.right);
                }
            }
            res.add(0,list);
        }
        return res;
    }
}

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<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null ){
            return res;
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        int level = 0;
        while(!queue.isEmpty()){
            int size = queue.size();
            List<Integer> list = new ArrayList<Integer>();
            for(int i=0;i<size;i++){
                TreeNode cur = queue.poll();
                if(level %2 ==0){
                    list.add(cur.val);
                }else{
                    list.add(0,cur.val);
                }
                if(cur.left!=null){
                    queue.offer(cur.left);
                }
                if(cur.right!=null){
                    queue.offer(cur.right);
                }
            }
            res.add(list);
            level++;
        }
        return res;
    }
}

199. Binary Tree Right Side View

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

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

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root == null){
            return res;
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            List<Integer> list = new ArrayList<Integer>();
            for(int i=0;i<size;i++){
                TreeNode cur = queue.poll();
                list.add(cur.val);
                if(cur.left!=null){
                    queue.offer(cur.left);
                }
                if(cur.right!=null){
                    queue.offer(cur.right);
                }
            }
            res.add(list.get(size-1));
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/u014116780/article/details/82978934