zoukankan      html  css  js  c++  java
  • 死磕二叉树(二)

    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;
        }
    }
    
  • 相关阅读:
    使用NPOI将多张图片导入execl
    Oracle计算时间差函数
    Oracle_spatial的函数介绍[转]
    FDO error:Failed to label layer(XXX) for class Default
    您属于哪个版本的程序员[转]
    关于oracle-12514错误的修改方法
    ArcGis在Oracle中常用的sql
    读取XML绑定TreeNode
    HTML中图片热区的使用
    如何查看目前正在使用的Windows10是哪个版本?
  • 原文地址:https://www.cnblogs.com/punnpkin/p/13575493.html
Copyright © 2011-2022 走看看