zoukankan      html  css  js  c++  java
  • 把二叉树打印多行

    题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

    更容易理解的思路,用计数器的方式 和队列 计数每次出队的节点数 等于这一层的节点数时 表明本层遍历完了

    import java.util.*;
    public class Solution {
        ArrayList<ArrayList<Integer> > Print(TreeNode r) {
              ArrayList<ArrayList<Integer> > res = new ArrayList<>();
            if (r==null) return res;
            //保存当前层的节点值
            ArrayList<Integer> list = new ArrayList<>();
            //保存当前层的节点
            LinkedList<TreeNode> q = new LinkedList<>();
            //初始化
            int start = 0;
            //根节点只有1个
            int end = 1;
            q.addLast(r);
            while(!q.isEmpty()){
                TreeNode t = q.removeFirst();
                list.add(t.val);
                //从队列出队一个 就加1;
                start++;
                if(t.left != null){
                    q.addLast(t.left);
                } 
                if(t.right != null){
                    q.addLast(t.right);
                } 
                //出队的个数 等于这层的数量 表面这层便利完了。
                if (start == end){
                    //恢复初始值
                    start =0;
                    //下一层的节点数
                    end = q.size();
                    res.add(new ArrayList<>(list));
                    list.clear();
                }
            }
            return res;
        }
        
    }

    思路:设置两个指针,一个指向当前层最右,另一个指向现在遍历的节点,,基本就是bfs。。。加一个换行判断

    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
            if(pRoot==null) return new ArrayList<>();
            TreeNode last=pRoot;
               TreeNode nlast=null;
           LinkedList<TreeNode> queue=new LinkedList<TreeNode>();
            ArrayList<Integer> temp=new ArrayList<Integer>();
            ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
            queue.add(pRoot);
            while(!queue.isEmpty()){
                   TreeNode cur=queue.poll();
                temp.add(cur.val);
                if(cur.left!=null){
                    queue.add(cur.left);
                    nlast=cur.left;
                }
                if(cur.right!=null){
                    queue.add(cur.right);
                    nlast=cur.right;
                }
                if(cur==last){
                    res.add(temp);
                    temp=new ArrayList<Integer>();
                    last=nlast;
                }
            }
            return res;
        }
  • 相关阅读:
    【转】内部Handler类引起内存泄露
    检测是否存在相机硬件代码
    asp.net 过滤器
    iis 中经典和集成模式对应webconfig节点
    事务
    C# Excel操作
    一步一步部署SSIS包图解教程
    js和.net操作Cookie遇到的问题
    File,FileInfo,Directory,DirectoryInfo
    C#文件Copy
  • 原文地址:https://www.cnblogs.com/team42/p/6691797.html
Copyright © 2011-2022 走看看