剑指offer24 JZ78 把二叉树打印成多行

把二叉树打印成多行

https://www.nowcoder.com/practice/445c44d982d04483b04a54f298796288?tpId=13&tqId=23453&ru=/exam/oj/ta&qru=/ta/coding-interviews/question-ranking&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D13%26type%3D13

难点实现 每一层分层

思路

题目要求将二叉树按行打印,即按层打印,其中每层分开。不难想到,要使用层次遍历,但是难点在于如何每层分开存储,从哪里知晓分开的时机?在层次遍历的时候,我们通常会借助队列(queue),事实上,队列中的值大有玄机,让我们一起来看看:

  • 当根节点进入队列时,队列长度为1,第一层节点数也为1
  • 若是根节点有两个子节点,push进队列后,队列长度为2,第二层节点数也为2;若是根节点一个子节点, - push进队列后,队列长度为为1,第二层节点数也为1.
  • 由此,我们可知,每层的节点数等于进入该层时队列长度,因为刚进入该层时,这一层每个节点都会push进队列,而上一层的节点都出去了。

每次只要在队列长度内循环,必定是一层,一层访问完毕再更新队列长度即可 alt

import java.util.*;


/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
   
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer> > res=new ArrayList<>();
        if(pRoot==null){
            return res;
        }
    
      Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
        queue.offer(pRoot); //添加根节点
        while(!queue.isEmpty()){
            ArrayList<Integer> array=new ArrayList<>();
            //每层的节点个数等于  队列的长度
            int n=queue.size();
            //循环添加每一层
            for(int i=0;i<n;i++){
                TreeNode temp=queue.poll();
                 array.add(temp.val);
            if(temp.left!=null){
                queue.offer(temp.left);
            }
            if(temp.right!=null){
                queue.offer(temp.right);   
                }
            }
            res.add(array);   
    }
    return res;
}
}
全部评论

相关推荐

点赞 评论 收藏
分享
神哥了不得:放平心态,再找找看吧,主要现在计算机也变卷了,然后就比较看学历了,之前高中毕业你技术强,都能找到工作的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务