利用go語言實(shí)現(xiàn)查找二叉樹中的最大寬度
介紹
這道題是這樣的,有一個(gè)二叉樹,讓求出這顆Bt樹里面最大的寬度是有幾個(gè)節(jié)點(diǎn),同時(shí)還要求出最大寬度的這些節(jié)點(diǎn)在第幾層?
比如:下面這顆樹,它每層最大的寬度是3,所在的層數(shù)是在第3層
流程
- 這個(gè)題主要是使用隊(duì)列的方式來存儲需要遍歷的節(jié)點(diǎn)
- 同時(shí)還需要幾個(gè)變量來存儲最大的寬度(maxWidth)、每層有幾個(gè)節(jié)點(diǎn)(count)、最大寬度所在的層(maxInrow)、當(dāng)前層最后一個(gè)節(jié)點(diǎn)(currentRowEndNode)、下一層最后一個(gè)節(jié)點(diǎn)(nextRowEndNode)
- 程序的一開始,便將二叉樹的頭節(jié)點(diǎn)加入到隊(duì)列里面,同時(shí)將這個(gè)節(jié)點(diǎn)賦值給下一層最后一個(gè)節(jié)點(diǎn)因當(dāng)根節(jié)點(diǎn)只有一個(gè)節(jié)點(diǎn),同時(shí)也將當(dāng)前行的最后一個(gè)節(jié)點(diǎn)賦值為這個(gè)節(jié)點(diǎn)
- 通過循環(huán)來對這個(gè)隊(duì)列進(jìn)行遍歷,當(dāng)進(jìn)入循環(huán)后就認(rèn)為走到了一個(gè)節(jié)點(diǎn),count就要加1
- 將隊(duì)列里面的節(jié)點(diǎn)元素開始彈出,如果它的子節(jié)點(diǎn)存在就將子節(jié)點(diǎn)賦值給nextRowEndNode,先賦值左再賦值右(因?yàn)橄忍幚淼氖亲笞庸?jié)點(diǎn)),同時(shí)將這倆個(gè)節(jié)點(diǎn)加入到隊(duì)列里面(如果它們存在的話)
- 還要對當(dāng)前的節(jié)點(diǎn)進(jìn)行一個(gè)判斷,判斷當(dāng)前的節(jié)點(diǎn)是不是到了當(dāng)前行的最后一個(gè)節(jié)點(diǎn),如果是的話,就代表當(dāng)前行的數(shù)據(jù)已經(jīng)處理完成,就要把nextRowEndNode賦值給currentRowEndNode,count置0
- 進(jìn)行下一波循環(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 //臨時(shí)保存節(jié)點(diǎn)的隊(duì)列 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é)點(diǎn)的left、right分別賦值給nextRowEndNode
呢?
因?yàn)樵谝粋€(gè)子節(jié)點(diǎn)下面的left和right并不是全都存在的,有的時(shí)候會是個(gè)空,所以這里要分別賦值
if currentRowEndNode == treeNode
:這一個(gè)判斷里面,因?yàn)槿绻M(jìn)入到了這個(gè)判斷里面就說明到了當(dāng)前層的最后一個(gè)節(jié)點(diǎn)了,所以就要把下一層的最后一個(gè)節(jié)點(diǎn)賦值給當(dāng)前層的最后一個(gè)節(jié)點(diǎn);
因?yàn)檫€有一個(gè)要找出最大寬度的一個(gè)功能,所以這個(gè)maxWidth要和coutn做一個(gè)比較如果maxWidth比較小的話就將count賦值給maxWidth,同時(shí)將當(dāng)前的層數(shù)賦值給maxInrow;
row
:而row
在這里面所充當(dāng)?shù)慕巧钱?dāng)前是完成第幾行的操作
為啥這里要定義一個(gè)currentRowEndNode和nextRowEndNode?
這種的寫法按層來處理,當(dāng)獲取到一個(gè)節(jié)點(diǎn)的時(shí)候,這時(shí)我就要拿到他們的子節(jié)點(diǎn),如果現(xiàn)在不獲取子節(jié)點(diǎn)的話在后面是沒有辦法獲取的,當(dāng)這一行結(jié)束的時(shí)候?qū)extRowEndNode賦值給currentRowEndNode,接下來nextRowEndNode再找下一層的最后一個(gè)節(jié)點(diǎn)。
到此這篇關(guān)于利用go語言實(shí)現(xiàn)查找二叉樹中的最大寬度的文章就介紹到這了,更多相關(guān)go查找二叉樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)將中文轉(zhuǎn)化為拼音
這篇文章主要為大家詳細(xì)介紹了如何通過Golang實(shí)現(xiàn)將中文轉(zhuǎn)化為拼音功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02在Golang中正確的修改HTTPRequest的Host的操作方法
我們工作中經(jīng)常需要通過HTTP請求Server的服務(wù),比如腳本批量請求接口跑數(shù)據(jù),由于一些網(wǎng)關(guān)策略,部分Server會要求請求中Header里面附帶Host參數(shù),所以本文給大家介紹了如何在Golang中正確的修改HTTPRequest的Host,需要的朋友可以參考下2023-12-12Golang如何交叉編譯各個(gè)平臺的二進(jìn)制文件詳解
這篇文章主要給大家介紹了關(guān)于Golang如何交叉編譯各個(gè)平臺的二進(jìn)制文件的相關(guān)資料,并介紹了golang如何讓編譯生產(chǎn)的二進(jìn)制文件變小,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08