数据结构2 二叉树的高度和宽度
宽度:节点的叶子数
深度:节点的层数
算法上有所谓的"宽度优先算法"和"深度优先算法"
二叉树的宽度定义为具有最多结点数的层中包含的结点数。
比如上图中,
第1层有1个节点,
第2层有2个节点,
第3层有4个节点,
第4层有1个节点,
可知,第3层的结点数最多
所以这棵二叉树的宽度就是4
定义一个节点类
class TreeNode { char val; TreeNode left = null; TreeNode right = null; TreeNode(char _val) { this.val = _val; } }
1求高度
这个可以使用递归,分别求出左子树的深度、右子树的深度,两个深度的较大值+1即可。
int getHeight(TreeNode root) { if(root==null) return 0; else{ int left=getHeight(root.left); int right=getHeight(root.right); return 1+Math.max(left,right); } }
2求宽度
使用队列,层次遍历二叉树。在上一层遍历完成后,下一层的所有节点已经放到队列中,此时队列中的元素个数就是下一层的宽度。以此类推,依次遍历下一层即可求出二叉树的最大宽度。
public int getWeight(TreeNode root) { if(root==null) return 1; Queue <TreeNode>queue=new ArrayDeque<TreeNode>(); int maxWeight=1;//最大宽度 queue.add(root);//入队 while(true) { int len=queue.size();//当前层节点数 if(len==0) break; while(len>0)//如果当前层还有节点 { TreeNode t=queue.poll(); len--; if(t.left!=null) queue.add(t.left);//下一层节点入队 if(t.right!=null) queue.add(t.right); //下一层节点入队 } maxWeight=Math.max(maxWeight,queue.size()); } return maxWeight; }
求宽度 方法2
//求叶子数 public static int countOfLeaf(TreeNode root) { int result=0; if(root==null) return 0; if(root.left==null || root.right==null) return 1; else result= countOfLeaf(root.left)+countOfLeaf(root.right); return result; }
参考:http://www.cnblogs.com/xudong-bupt/p/4036190.html
分类:
算法与数据结构-java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器