求二叉树最大节点数的层

题目描述

请比较一棵二叉树每一层的节点数,求出节点数最多的层节点数。

思路分析

首先,遍历二叉树的层,就是二叉树的层序遍历,这个是基础了,利用一个队列,每遍历到一个节点,就把其左右孩子以此入队列,然后每出队列一个节点,就入队列其左右孩子,就能实现层序遍历。
如何统计每一层有多少节点呢?
常见两种思路:

思路一:

既然要统计每一层有多少节点,那我们只需要将各个节点对应的层号记下来就可以了。因此,方法一,利用一个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;
}```

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值