二叉树求树的最大宽度

本文介绍了一种求解二叉树最大宽度的算法实现,通过层次遍历的方法结合HashMap记录节点所在层级,最终得出二叉树每层的最大节点数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求一颗二叉树的最大宽度

题目:给定一个二叉树节点的定义,要求返回二叉树最大宽度。

*分析:二叉树的最大宽度也就是在二叉树上某一层节点的的个数达最大。
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;

//求一颗树最大宽度的节点数
/*
 *  分析:二叉树的最大宽度也就是在二叉树上某一层节点的的个数达最大。
 *      1.采用HashMap 存放一组<k,v>.k表示当前节点,
 *        v表示当前节点的层数以便统计每一层的节点数,和跳转下一层重新统计
 *      2.队列是为了层次遍历整棵树。
 *      3.别忘最后一层统计,做比较
 * */
public class GetTreeMaxWidth {
	static class TreeNode {
		public int value;
		public TreeNode leftChild;
		public TreeNode rightChild;

		public TreeNode(int data, TreeNode lc, TreeNode rc) {
			this.value = data;
			this.leftChild = lc;
			this.rightChild = rc;
		}
	}
	//主函数
	public static void main(String[] args) {
		TreeNode node7 = new TreeNode(7,null,null);
		TreeNode node8 = new TreeNode(8,null,null);
		TreeNode node9 = new TreeNode(9,null,null);
		TreeNode node10 = new TreeNode(10,null,null);
		TreeNode node11 = new TreeNode(11,null,null);
		TreeNode node12 = new TreeNode(12,null,null);
		TreeNode node6 = new TreeNode(6,node11,node12);
		TreeNode node5 = new TreeNode(5,node9,node10);
		TreeNode node4 = new TreeNode(4,node7,node8);
		TreeNode node3 = new TreeNode(3,node5,node6);
		TreeNode node2 = new TreeNode(2,node4,null);
		TreeNode node1 = new TreeNode(1,node2,node3);	
		System.out.println(getMaxWith(node1));
	}
	static int getMaxWith(TreeNode head) {
		int max=0;//最大宽度
		int curNodes = 0;//当前节点数
		int curLevel = 1;//当前层数
		//hashmap 就是记录此节点的当前层数
		HashMap<TreeNode, Integer> levelMap = new HashMap<TreeNode, Integer>();
		levelMap.put(head, curLevel);
		
		//由于我要层次遍历这一颗树,统计每一层的节点树所以定义一个队列
		Queue<TreeNode> queueNode = new LinkedList<TreeNode>();
		queueNode.add(head);
		while (!queueNode.isEmpty()) {
			TreeNode curNode = queueNode.poll();
			int curNodeLevel = levelMap.get(curNode); //当前节点所在的层数
			//如果左孩子不空 要更新levelMap的值和将左孩子加入队列
			if(curNode.leftChild != null) {
			     queueNode.add(curNode.leftChild);
			     levelMap.put(curNode.leftChild, curLevel+1);
			     
			}
			//如果右孩子不空 要更新levelMap的值和将右孩子加入队列
			if(curNode.rightChild != null) {
				 queueNode.add(curNode.rightChild);
			     levelMap.put(curNode.rightChild, curLevel+1);
			}
			//要判断当前层是不是等于当前节点所在的层,来更新当前节点数
			if(curLevel == curNodeLevel)
				curNodes++;
			//如果不是则说明此时那一层节点统计完毕,要更新max和当前层节点+=1和当前节点数=1
			else {
				max = Math.max(max, curNodes);
				curLevel++;
				curNodes=1;
			}
		}
		//最后一层别忘了对比,
		max = Math.max(max, curNodes);
		return max;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值