亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

利用go語言實現(xiàn)查找二叉樹中的最大寬度

 更新時間:2022年05月17日 11:58:39   作者:??呆呆燦????  
這篇文章主要介紹了利用go語言實現(xiàn)查找二叉樹中的最大寬度,文章圍繞主題展開詳細(xì)介紹,具有一定的參考價值,需要的小伙伴可以參考一下

介紹

這道題是這樣的,有一個二叉樹,讓求出這顆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)來對這個隊列進(jìn)行遍歷,當(dāng)進(jìn)入循環(huán)后就認(rèn)為走到了一個節(jié)點,count就要加1
  • 將隊列里面的節(jié)點元素開始彈出,如果它的子節(jié)點存在就將子節(jié)點賦值給nextRowEndNode,先賦值左再賦值右(因為先處理的是左子節(jié)點),同時將這倆個節(jié)點加入到隊列里面(如果它們存在的話)
  • 還要對當(dāng)前的節(jié)點進(jìn)行一個判斷,判斷當(dāng)前的節(jié)點是不是到了當(dāng)前行的最后一個節(jié)點,如果是的話,就代表當(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
	//臨時保存節(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:這一個判斷里面,因為如果進(jìn)入到了這個判斷里面就說明到了當(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)文章

  • Golang中的參數(shù)傳遞示例詳解

    Golang中的參數(shù)傳遞示例詳解

    參數(shù)傳遞是指在程序的傳遞過程中,實際參數(shù)就會將參數(shù)值傳遞給相應(yīng)的形式參數(shù),然后在函數(shù)中實現(xiàn)對數(shù)據(jù)處理和返回的過程,下面這篇文章主要給大家介紹了關(guān)于Golang中參數(shù)傳遞的相關(guān)資料,需要的朋友可以參考下。
    2017-09-09
  • Go 并發(fā)讀寫 sync.map 詳細(xì)

    Go 并發(fā)讀寫 sync.map 詳細(xì)

    閱讀本文你將會明確 sync.Map 和原生 map +互斥鎖/讀寫鎖之間的性能情況。標(biāo)準(zhǔn)庫 sync.Map 雖說支持并發(fā)讀寫 map,但更適用于讀多寫少的場景,因為他寫入的性能比較差,使用時要考慮清楚這一點。
    2021-10-10
  • GO制作微信機器人的流程分析

    GO制作微信機器人的流程分析

    這篇文章主要介紹了利用go制作微信機器人,本文主要包括項目基礎(chǔ)配置及詳細(xì)代碼講解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • Golang實現(xiàn)將中文轉(zhuǎn)化為拼音

    Golang實現(xiàn)將中文轉(zhuǎn)化為拼音

    這篇文章主要為大家詳細(xì)介紹了如何通過Golang實現(xiàn)將中文轉(zhuǎn)化為拼音功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-02-02
  • 在Golang中正確的修改HTTPRequest的Host的操作方法

    在Golang中正確的修改HTTPRequest的Host的操作方法

    我們工作中經(jīng)常需要通過HTTP請求Server的服務(wù),比如腳本批量請求接口跑數(shù)據(jù),由于一些網(wǎng)關(guān)策略,部分Server會要求請求中Header里面附帶Host參數(shù),所以本文給大家介紹了如何在Golang中正確的修改HTTPRequest的Host,需要的朋友可以參考下
    2023-12-12
  • GO語言利用K近鄰算法實現(xiàn)小說鑒黃

    GO語言利用K近鄰算法實現(xiàn)小說鑒黃

    本文給大家分享的是一段GO語言利用K近鄰算法實現(xiàn)小說鑒黃的方法,本方法的鑒別的關(guān)鍵是關(guān)鍵是向量點的選擇和閾值的判定,推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • Go 實現(xiàn)英尺和米的簡單單位換算方式

    Go 實現(xiàn)英尺和米的簡單單位換算方式

    這篇文章主要介紹了Go 實現(xiàn)英尺和米的簡單單位換算方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • golang如何通過type定義函數(shù)類型

    golang如何通過type定義函數(shù)類型

    這篇文章主要介紹了golang如何通過type定義函數(shù)類型問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 淺談golang的http cookie用法

    淺談golang的http cookie用法

    本篇文章主要介紹了golang的http cookie用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Golang如何交叉編譯各個平臺的二進(jìn)制文件詳解

    Golang如何交叉編譯各個平臺的二進(jìn)制文件詳解

    這篇文章主要給大家介紹了關(guān)于Golang如何交叉編譯各個平臺的二進(jìn)制文件的相關(guān)資料,并介紹了golang如何讓編譯生產(chǎn)的二進(jìn)制文件變小,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08

最新評論