Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > go查找二叉树最大宽度

利用go语言实现查找二叉树中的最大宽度

作者:​ 呆呆灿   ​

这篇文章主要介绍了利用go语言实现查找二叉树中的最大宽度,文章围绕主题展开详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下

介绍

这道题是这样的,有一个二叉树,让求出这颗Bt树里面最大的宽度是有几个节点,同时还要求出最大宽度的这些节点在第几层?

比如:下面这颗树,它每层最大的宽度是3,所在的层数是在第3层

流程

代码

二叉树结构体

type TreeNode struct {
	val   string
	left  *TreeNode
	right *TreeNode
}

测试代码

func main() {
	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)
}

查找二叉树最大宽度的代码

func findBtMaxWidth(bt *TreeNode) (maxWidth int, maxInrow int) {
	row := 0
	//临时保存节点的队列
	var tempSaveNodeQueue []*TreeNode
	//保存宽度
	count := 1
	var currentRowEndNode *TreeNode
	var nextRowEndNode *TreeNode
	if bt != nil {
		nextRowEndNode = bt
		currentRowEndNode = nextRowEndNode
		tempSaveNodeQueue = append(tempSaveNodeQueue, bt)
	}
	for len(tempSaveNodeQueue) != 0 {
		count++
		treeNode := tempSaveNodeQueue[0]
		tempSaveNodeQueue = tempSaveNodeQueue[1:]

		if treeNode.left != nil {
			nextRowEndNode = treeNode.left
			tempSaveNodeQueue = append(tempSaveNodeQueue, treeNode.left)
		}

		if treeNode.right != nil {
			nextRowEndNode = treeNode.right
			tempSaveNodeQueue = append(tempSaveNodeQueue, treeNode.right)
		}
		if currentRowEndNode == treeNode {
			row++
			currentRowEndNode = nextRowEndNode
			if maxWidth < count {
				maxInrow = row
				maxWidth = count
			}
			count = 0
		}
	}
	return
}

代码解读

这里面的代码大部分的逻辑还是很简单的,

说一下在if判断里面的代码叭,为啥要分别将子节点的leftright分别赋值给nextRowEndNode呢?

因为在一个子节点下面的left和right并不是全都存在的,有的时候会是个空,所以这里要分别赋值

if currentRowEndNode == treeNode:这一个判断里面,因为如果进入到了这个判断里面就说明到了当前层的最后一个节点了,所以就要把下一层的最后一个节点赋值给当前层的最后一个节点;

因为还有一个要找出最大宽度的一个功能,所以这个maxWidth要和coutn做一个比较如果maxWidth比较小的话就将count赋值给maxWidth,同时将当前的层数赋值给maxInrow;

row:而row在这里面所充当的角色是当前是完成第几行的操作

为啥这里要定义一个currentRowEndNode和nextRowEndNode?

这种的写法按层来处理,当获取到一个节点的时候,这时我就要拿到他们的子节点,如果现在不获取子节点的话在后面是没有办法获取的,当这一行结束的时候将nextRowEndNode赋值给currentRowEndNode,接下来nextRowEndNode再找下一层的最后一个节点。

到此这篇关于利用go语言实现查找二叉树中的最大宽度的文章就介绍到这了,更多相关go查找二叉树内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文