美文网首页
把二叉树打印成多行

把二叉树打印成多行

作者: 囧略囧 | 来源:发表于2018-10-26 11:18 被阅读0次

题目描述

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

这道题目与“从上往下打印二叉树”很相似,可以用队列来解决。但是区别在于这道题目需要将每一层进行分行。

解法一:

我们可以使用一个队列来保存当前层的节点,将当前层节点的叶节点保存在另一个队列中,这样需要两个队列来进行遍历。

public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> newLine = new ArrayList<Integer>();
        //记录当前层节点
        Queue<TreeNode> list = new LinkedList<TreeNode>();
        //记录当前层的下一层节点
        Queue<TreeNode> nextList = new LinkedList<TreeNode>();
        if(pRoot == null) {
            return res;
        }
        list.add(pRoot);
        //遍历每一层
        while(!list.isEmpty()) {
            newLine = new ArrayList<Integer>();
            while(!list.isEmpty()) {
                TreeNode currentNode = list.poll();
                newLine.add(currentNode.val);
                if(currentNode.left != null) {
                    nextList.add(currentNode.left);
                }
                if(currentNode.right != null) {
                    nextList.add(currentNode.right);
                }
            }
            if(newLine.size() != 0) {
                res.add(newLine);
            } 
            //更新当前层
            list = nextList;
            nextList = new LinkedList<TreeNode>();
        }
        return res;
    }
}

解法二:

实际上我们只需要一个队列也能完成这个任务,只需要记录这个队列中有几个当前层节点,有几个下一层节点。

public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        if(pRoot == null) {
            return res;
        }
        queue.add(pRoot);
        int currentCount = 1;
        int nextCount = 0;
        while(currentCount != 0) {
            ArrayList<Integer> newLine = new ArrayList<Integer>();
            while(currentCount > 0) {
                TreeNode node = queue.poll();
                newLine.add(node.val);
                currentCount--;
                if(node.left != null) {
                    queue.add(node.left);
                    nextCount++;
                }
                if(node.right != null) {
                    queue.add(node.right);
                    nextCount++;
                }
            }
            if(newLine.size() != 0) {
                res.add(newLine);
            }
            currentCount = nextCount;
            nextCount = 0;
        }
        return res;
    }
}

上述代码通过currentCount来记录队列中还剩的当前层节点数,nextCount来记录队列中下一层节点数。

如果一个节点有非空子节点,则每把一个非空子节点放入队列中,nextCount加1。每保存了一个节点,则currentCount减1。

当currentCount为0时,表示当前层打印完毕,接着打印下一层,直到遍历完所有节点。

相关文章

  • 剑指offer | 把二叉树打印成多行

    把二叉树打印成多行 从上到下按层打印成多行 分析:使用队列

  • [剑指offer]刷题笔记

    按之字顺序打印二叉树 把二叉树打印成多行 按之字顺序打印二叉树【树】【常考!!!】 题目描述:请实现一个函数按照之...

  • 剑指第三周

    对称的二叉树 其实就是要遍历嘛 按之字形顺序打印二叉树 同样是简单的层次遍历 把二叉树打印成多行 这个更简单了 栈...

  • 把二叉树打印成多行

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 这道题目与“从上往下打印二叉树”很相似...

  • 把二叉树打印成多行

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

  • 把二叉树打印成多行

    《剑指offer》刷题笔记。如有更好解法,欢迎留言。 关键字:树的广度遍历(层次遍历)、队列 题目描述: 从上到下...

  • 把二叉树打印成多行

    从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 层次遍历即可可设置两个变量cur和next,分别...

  • 把二叉树打印成多行

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 问题分析 利用一个queue队列存放同...

  • 把二叉树打印成多行

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 AC代码 思路 关键点是找一个变量记录...

  • 把二叉树打印成多行

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

网友评论

      本文标题:把二叉树打印成多行

      本文链接:https://www.haomeiwen.com/subject/hvjktqtx.html