题目描述
请比较一棵二叉树每一层的节点数,求出节点数最多的层节点数。
思路分析
首先,遍历二叉树的层,就是二叉树的层序遍历,这个是基础了,利用一个队列,每遍历到一个节点,就把其左右孩子以此入队列,然后每出队列一个节点,就入队列其左右孩子,就能实现层序遍历。
如何统计每一层有多少节点呢?
常见两种思路:
思路一:
既然要统计每一层有多少节点,那我们只需要将各个节点对应的层号记下来就可以了。因此,方法一,利用一个map,来记录节点及其对应的层号。
变量:
int level:记录当前层号,从1开始
int levelNum;记录当前层的节点数,初值为0
int leveMax:记录当前的最大层的节点数,初值为-1
map:记录层节点及其对应的层号
算法思路;
首先,先把根节点放入map中<Node,1>,表示根节点是第一层,然后,把根节点放入队列,就是层序遍历的过程。然后。跟节点出队列,此时,把根节点左右孩子入队列的同时,将左右孩子入map,同时左右孩子层数为2,然后,此时level为1,levelNum+1。当出队列的map的value变成2时,将levelMax更新,再把levelNum重置为1,level更新为目前的最大值的层号。
代码:
public static int w(Node head){
if(head==null){
return 0;
}
Queue<Node> queue=new LinkedList<>();
queue.add(head);
HashMap<Node,Integer> map=new HashMap<>();
map.put(head,1);
int level=1;
int levelNum=0;
int levelMax=-1;
while(!queue.isEmpty()){
Node cur=queue.poll();
int floorNum=map.get(cur);
if(level==floorNum){
levelNum++;
}else{
levelMax=Math.max(levelMax,levelNum);
levelNum=1;
level++;
}
if(cur.left!=null){
queue.add(cur.left);
map.put(cur.left,floorNum+1);
}
if(cur.right!=null){
queue.add(cur.right);
map.put(cur.right,floorNum+1);
}
}
return levelMax;
}
思路二
上面思路一是借助一个map来记录每个节点的层号,那么如果不使用map来记录层号,怎么实现呢?
我们思路一是通过记录每个节点对应的层号,来判断某个层的层序遍历是否结束。其实,因为层序遍历的过程本来就是一层一层从左往右,相当于,遍历过程已经确定了,那么,此时,我们是不是只需要判断什么时候一层的遍历结束了就可以了?其实是不需要知道具体对应的层号的,对吧?
分析题目,我们需要一个Node类型的变量来保存每一层的最后一个节点,来标志这一层的结束,每遍历到这个标志时,就把当前层的数量和最大值对比,并更新,因此,我们还需要一个max保存当前最大节点数。但是,我们如何知道当前层的最后一个节点是哪个呢?这样考虑,上一层最后一个放入队列的孩子节点,就是下一层的最后一个节点,对吧?因此,我们还需要一个变量来保存上一层最后一个放入的节点。当一层遍历完时,把下一层的最后一个节点更新为当前层最后一个就行了。
因此,变量:
Node curEnd;当前层最后一个节点
Node nextEnd;下一层最后一个放入的孩子节点,其实就是下一层最后一个节点
int num=0;累加每层的节点数
int max=-1;记录最大节点数
代码
public static int w(Node head){
if(head==null){
return 0;
}
Queue<Node> queue=new LinkedList<>();
queue.add(head);
Node curEnd=head;
Node nextEnd=null;
int num=0;
int max=-1;
while(!queue.isEmpty()){
Node cur=queue.poll();
if(cur.left!=null){
queue.add(cur.left);
nextEnd=cur.left;
}
if(cur.right!=null){
queue.add(cur.right);
nextEnd=cur.right;
}
num++;
if(cur==curEnd){
max=Math.max(max,num);
num=0;
curEnd=nextEnd;
nextEnd=null;
}
}
return max;
}```