• 死磕二叉树(二)


    102. 二叉树的层序遍历

    二叉树层序遍历可以借助BFS的思想解决:

    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
    
        }
    }
    

    拿到这个题目之后,首先看到返回的类型是一个List<List<Integer>>,因此在构造返回结果的时候,结果也是按层进行添加的,也就是说,在处理的过程中需要保存当前访问的

    // 构造返回结果
    List<List<Integer>> res = new LinkedList<List<Integer>>();
    
    // 动态添加值
    List<Integer> list = new LinkedList<>();
    res.add(list);
    

    其次,为了达到层次遍历的效果,可以把二叉树的依次按层节点压入到队列中,再依次弹出使用:

    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    
    TreeNode node = queue.poll();
    if(node.left != null) queue.add(node.left);
    if(node.right != null) queue.add(node.right);
    

    可以说,队列一次性保存了二叉树某个层的全部节点,一层一层的直到最底层:

    public class Solution {
        // 迭代
        public List<List<Integer>> levelOrder(TreeNode root) {
            List<List<Integer>> res = new LinkedList<List<Integer>>();
            if(root == null) return res;
    
            Queue<TreeNode> queue = new LinkedList<TreeNode>();
            queue.add(root);
    
            while (!queue.isEmpty()){
                List<Integer> list = new LinkedList<>();
                int level_length = queue.size();
                for (int i = 0; i < level_length; i++) {
                    TreeNode node = queue.poll();
                    list.add(node.val);
                    if(node.left != null) queue.add(node.left);
                    if(node.right != null) queue.add(node.right);
                }
                res.add(list);
            }
    
            return res;
        }
    }
    

    107. 二叉树的层次遍历 II

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

    和上一题的唯一区别就是:每层的结点在结果中存放的先后顺序不同

    稍微调整一下代码:

    res.add(0, list);
    

    剑指 Offer 32 - III. 从上到下打印二叉树 III

    请实现一个函数按照之字形顺序打印二叉树

    通过奇偶层的分离,就可以实现之字形打印的。在层序遍历中,res按保存了遍历的结果,因此可以借助res.size来区分奇偶层,也可以在循环外单独设置一个变量来指示当前的层数:

    public class Solution {
        // 迭代
        public List<List<Integer>> levelOrder(TreeNode root) {
            List<List<Integer>> res = new LinkedList<List<Integer>>();
            if(root == null) return res;
    
            Queue<TreeNode> queue = new LinkedList<TreeNode>();
            queue.add(root);
    
            int level = 0;
            while (!queue.isEmpty()){
                List<Integer> list = new LinkedList<>();
                int level_length = queue.size();
                for (int i = 0; i < level_length; i++) {
                    TreeNode node = queue.poll();
                    if (level % 2 == 0) list.add(node.val);
                    else list.add(0, node.val);
                    if(node.left != null) queue.add(node.left);
                    if(node.right != null) queue.add(node.right);
                }
                res.add(list);
                level ++;
            }
    
            return res;
        }
    }
    
  • 相关阅读:
    cmake使用总结
    Fatal error RC1015: cannot open include file "xxxx.h" vs2008
    可重入函数(转)
    《左耳听风》-ARTS-打卡记录-第十二周
    异常声明
    QString与const char *相互转换
    Qt中使用子线程去关闭弹出框
    什么是反向代理
    【GOJ 3002】颜色
    【GOJ 2296】毛毛虫
  • 原文地址:https://www.cnblogs.com/punnpkin/p/13575493.html
Copyright © 2020-2023  润新知