



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第利用go语言实现查找二叉树中的最大宽度目录介绍流程代码二叉树结构体测试代码查找二叉树最大宽度的代码代码解读
介绍
这道题是这样的,有一个二叉树,让求出这颗Bt树里面最大的宽度是有几个节点,同时还要求出最大宽度的这些节点在第几层?
比如:下面这颗树,它每层最大的宽度是3,所在的层数是在第3层
流程
这个题主要是使用队列的方式来存储需要遍历的节点同时还需要几个变量来存储最大的宽度(maxWidth)、每层有几个节点(count)、最大宽度所在的层(maxInrow)、当前层最后一个节点(currentRowEndNode)、下一层最后一个节点(nextRowEndNode)程序的一开始,便将二叉树的头节点加入到队列里面,同时将这个节点赋值给下一层最后一个节点因当根节点只有一个节点,同时也将当前行的最后一个节点赋值为这个节点通过循环来对这个队列进行遍历,当进入循环后就认为走到了一个节点,count就要加1将队列里面的节点元素开始弹出,如果它的子节点存在就将子节点赋值给nextRowEndNode,先赋值左再赋值右(因为先处理的是左子节点),同时将这俩个节点加入到队列里面(如果它们存在的话)还要对当前的节点进行一个判断,判断当前的节点是不是到了当前行的最后一个节点,如果是的话,就代表当前行的数据已经处理完成,就要把nextRowEndNode赋值给currentRowEndNode,count置0进行下一波循环
代码
二叉树结构体
typeTreeNodestruct{
valstring
left*TreeNode
right*TreeNode
}
测试代码
funcmain(){
sNode:=TreeNode{val:"1"}
sNode.left=TreeNode{val:"2"}
sNode.right=TreeNode{val:"3"}
sNode.left.left=TreeNode{val:"4"}
sNode.left.right=TreeNode{val:"5"}
sNode.right.left=TreeNode{val:"6"}
sNode.left.left.left=TreeNode{val:"7"}
sNode.left.left.right=TreeNode{val:"8"}
sNode.left.right.left=TreeNode{val:"9"}
sNode.left.right.right=TreeNode{val:"10"}
sNode.right.left.left=TreeNode{val:"11"}
maxW,row:=findBtMaxWidth(sNode)
fmt.Printf("最大宽度:%v;在第%v层",maxW,row)
}
查找二叉树最大宽度的代码
funcfindBtMaxWidth(bt*TreeNode)(maxWidthint,maxInrowint){
row:=0
//临时保存节点的队列
vartempSaveNodeQueue[]*TreeNode
//保存宽度
count:=1
varcurrentRowEndNode*TreeNode
varnextRowEndNode*TreeNode
ifbt!=nil{
nextRowEndNode=bt
currentRowEndNode=nextRowEndNode
tempSaveNodeQueue=append(tempSaveNodeQueue,bt)
forlen(tempSaveNodeQueue)!=0{
count++
treeNode:=tempSaveNodeQueue[0]
tempSaveNodeQueue=tempSaveNodeQueue[1:]
iftreeNode.left!=nil{
nextRowEndNode=treeNode.left
tempSaveNodeQueue=append(tempSaveNodeQueue,treeNode.left)
iftreeNode.right!=nil{
nextRowEndNode=treeNode.right
tempSaveNodeQueue=append(tempSaveNodeQueue,treeNode.right)
ifcurrentRowEndNode==treeNode{
row++
currentRowEndNode=nextRowEndNode
ifmaxWidthcount{
maxInrow=row
maxWidth=count
count=0
return
}
代码解读
这里面的代码大部分的逻辑还是很简单的,
说一下在if判断里面的代码叭,为啥要分别将子节点的left、right分别赋值给nextRowEndNode呢?
因为在一个子节点下面的left和right并不是全都存在的,有的时候会是个空,所以这里要分别赋值
ifcurrentRowEndNode==treeNode:这一个判断里面,因为如果进入到了这个判断里面就说明到了当前层的最后一个节点了,所以就要把下一层的最后一个节点赋值给当前层的最后一个节点;
因为还有一个要找出最大宽度的一个功能,所以这个maxWidth要和coutn做一个比较如果maxWidth比较小的话就将count赋值给maxWidth,同时将当前的层数赋值给maxInrow;
row:而row在这里面所充当的角色是当前是完成第几行的操作
为啥这里要定义一个currentRowEndNode和nextRowEndNode?
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025商务英语合同的基本结构
- 2025工程项目廉洁合同模板
- 2025专利权转让合同样本
- 2025景观设计项目采购合同
- 第10课 近代以来的世界贸易与文化交流的扩展 课件-【知识提要】高二下学期历史统编版(2019)选择性必修3文化交流与传播
- 培训能力测试试题及答案
- 助理广告师考试人员素质提升的有效路径试题及答案
- 2025《总公司合同管理规程》
- 平面广告设计师考试难点突破试题及答案
- 广告设计师文化素养试题及答案
- 2024初级社会工作者职业资格笔试考试易错题带答案
- 手机媒体概论(自考14237)复习题库(含真题、典型题)
- 2024年陕西省普通高中学业水平合格性考试历史试题(解析版)
- 拉美文化学习通超星期末考试答案章节答案2024年
- 集装箱七点检查表
- 建设工程项目质量控制(课件).
- 商品混凝土公司员工培训方案(参考)
- (参考)混凝土配合比设计原始记录
- 13-2.ZTL-W-T绝缘杆弯曲试验机说明书
- 坤集心法解密(兼论铁板神数扣入起数)
- 交直流与MATLAB仿真
评论
0/150
提交评论