利用go語言實現(xiàn)查找二叉樹中的最大寬度
介紹
這道題是這樣的,有一個二叉樹,讓求出這顆Bt樹里面最大的寬度是有幾個節(jié)點,同時還要求出最大寬度的這些節(jié)點在第幾層?
比如:下面這顆樹,它每層最大的寬度是3,所在的層數(shù)是在第3層

流程
- 這個題主要是使用隊列的方式來存儲需要遍歷的節(jié)點
- 同時還需要幾個變量來存儲最大的寬度(maxWidth)、每層有幾個節(jié)點(count)、最大寬度所在的層(maxInrow)、當(dāng)前層最后一個節(jié)點(currentRowEndNode)、下一層最后一個節(jié)點(nextRowEndNode)
- 程序的一開始,便將二叉樹的頭節(jié)點加入到隊列里面,同時將這個節(jié)點賦值給下一層最后一個節(jié)點因當(dāng)根節(jié)點只有一個節(jié)點,同時也將當(dāng)前行的最后一個節(jié)點賦值為這個節(jié)點
- 通過循環(huán)來對這個隊列進行遍歷,當(dāng)進入循環(huán)后就認(rèn)為走到了一個節(jié)點,count就要加1
- 將隊列里面的節(jié)點元素開始彈出,如果它的子節(jié)點存在就將子節(jié)點賦值給nextRowEndNode,先賦值左再賦值右(因為先處理的是左子節(jié)點),同時將這倆個節(jié)點加入到隊列里面(如果它們存在的話)
- 還要對當(dāng)前的節(jié)點進行一個判斷,判斷當(dāng)前的節(jié)點是不是到了當(dāng)前行的最后一個節(jié)點,如果是的話,就代表當(dāng)前行的數(shù)據(jù)已經(jīng)處理完成,就要把nextRowEndNode賦值給currentRowEndNode,count置0
- 進行下一波循環(huán)
代碼
二叉樹結(jié)構(gòu)體
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
//臨時保存節(jié)點的隊列
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判斷里面的代碼叭,為啥要分別將子節(jié)點的left、right分別賦值給nextRowEndNode呢?
因為在一個子節(jié)點下面的left和right并不是全都存在的,有的時候會是個空,所以這里要分別賦值
if currentRowEndNode == treeNode:這一個判斷里面,因為如果進入到了這個判斷里面就說明到了當(dāng)前層的最后一個節(jié)點了,所以就要把下一層的最后一個節(jié)點賦值給當(dāng)前層的最后一個節(jié)點;
因為還有一個要找出最大寬度的一個功能,所以這個maxWidth要和coutn做一個比較如果maxWidth比較小的話就將count賦值給maxWidth,同時將當(dāng)前的層數(shù)賦值給maxInrow;
row:而row在這里面所充當(dāng)?shù)慕巧钱?dāng)前是完成第幾行的操作
為啥這里要定義一個currentRowEndNode和nextRowEndNode?
這種的寫法按層來處理,當(dāng)獲取到一個節(jié)點的時候,這時我就要拿到他們的子節(jié)點,如果現(xiàn)在不獲取子節(jié)點的話在后面是沒有辦法獲取的,當(dāng)這一行結(jié)束的時候?qū)extRowEndNode賦值給currentRowEndNode,接下來nextRowEndNode再找下一層的最后一個節(jié)點。

到此這篇關(guān)于利用go語言實現(xiàn)查找二叉樹中的最大寬度的文章就介紹到這了,更多相關(guān)go查找二叉樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法
這篇文章主要為大家介紹了B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
golang?metrics各個指標(biāo)含義講解說明
這篇文章主要為大家介紹了golang?metrics各個指標(biāo)含義講解說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
Go strconv包實現(xiàn)字符串和基本數(shù)據(jù)類型轉(zhuǎn)換的實例詳解
在Go語言(Golang)的編程實踐中,strconv包是一個非常重要的標(biāo)準(zhǔn)庫,它提供了在基本數(shù)據(jù)類型(如整型、浮點型、布爾型)和字符串之間的轉(zhuǎn)換功能,本文給大家介紹了關(guān)于Go語言字符串轉(zhuǎn)換strconv,需要的朋友可以參考下2024-09-09

