zoukankan      html  css  js  c++  java
  • 中等-102,107-二叉树的层序遍历

    二叉树的层序遍历,普遍做法是用队列bfs;在某些需要记录level的题型中,dfs也是一种不错的方法。

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

    示例:
    二叉树:[3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7

    返回其层次遍历结果:

    [
      [3],
      [9,20],
      [15,7]
    ]

    不同于普通的层序遍历,现在需要分层,因此出队列的时候需要将同一层的一起出队,数量为出队前的队列长度。比较简单,不再赘述。

    public List<List<Integer>> levelOrder(TreeNode root) {
            if(root==null)
                return new ArrayList<>();
            List<List<Integer>> res = new ArrayList<>();
            Queue<TreeNode> queue = new ArrayDeque<>();
            queue.add(root);
            while (!queue.isEmpty()) {
                List<Integer> list = new ArrayList<>();
                int n = queue.size();
                for (int i = 0; i < n; i++) {  //同一层的节点出列
                    TreeNode top = queue.poll();  //poll()结合了C++中的top(),pop().
                    list.add(top.val);
                    if (top.left != null)
                        queue.add(top.left);
                    if (top.right != null)
                        queue.add(top.right);
                }
                res.add(list);
            }
            return res;
        }

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

    示例:
    给定二叉树 [3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7

    返回其自底向上的层次遍历为:

    [
      [15,7],
      [9,20],
      [3]
    ]

    递归在于要记录节点所在的level,以便回溯时添加进对应level的数组中。

    public List<List<Integer>> levelOrderBottom(TreeNode root) {
            if(root==null)
                return new ArrayList<>();
            List<List<Integer>> res = new ArrayList<>();
            dfs(root, 0, res);
            return res;
        }
    
        public void dfs(TreeNode root, int level, List<List<Integer>> res) {
            if(level>=res.size())  //新的一层,需要对res扩容
                res.add(0, new ArrayList<Integer>());  //由于倒序,新数组要添加在已有数组上方
            res.get(res.size()-level-1).add(root.val);  //添加进对应层的数组中
            if(root.left!=null)
                dfs(root.left, level + 1, res);
            if(root.right!=null)
                dfs(root.right, level + 1, res);
        }

    总结:这两题都可以用bfs和dfs的方法。

    107bfs:res.add(list);改为res.add(0,list);

    102dfs:res.add(0,new ArrayList<Integer>());改为res.add(new ArrayList<Integer>());且res.get(res.size()-level-1)改为res.get(level).

  • 相关阅读:
    [转贴]Asp.Net[C#]在线压缩解压
    [转载]如何用C#语言构造蜘蛛程序
    [转载].net 集合类初步认识
    试用随笔
    安装中文VS2008 SP1 和.NETFRAMEWORK 3.5SP1后智能提示是英文的解决办法
    关于IE提示“Internet Explorer无法打开站点,已终止操作”的解决办法
    linux每天建立一个以当天日期命名的文件夹
    linux常用装机命令
    linux安装oracle客户端
    批量分发文件
  • 原文地址:https://www.cnblogs.com/faded828x/p/13161630.html
Copyright © 2011-2022 走看看