最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

介紹

這道題是這樣的,有一個(gè)二叉樹,讓求出這顆Bt樹里面最大的寬度是有幾個(gè)節(jié)點(diǎn),同時(shí)還要求出最大寬度的這些節(jié)點(diǎn)在第幾層?

比如:下面這顆樹,它每層最大的寬度是3,所在的層數(shù)是在第3層

流程

  • 這個(gè)題主要是使用隊(duì)列的方式來(lái)存儲(chǔ)需要遍歷的節(jié)點(diǎn)
  • 同時(shí)還需要幾個(gè)變量來(lái)存儲(chǔ)最大的寬度(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)來(lái)對(duì)這個(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ì)列里面(如果它們存在的話)
  • 還要對(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
}

測(cè)試代碼

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
}

代碼解讀

這里面的代碼大部分的邏輯還是很簡(jiǎn)單的,

說一下在if判斷里面的代碼叭,為啥要分別將子節(jié)點(diǎn)的left、right分別賦值給nextRowEndNode呢?

因?yàn)樵谝粋€(gè)子節(jié)點(diǎn)下面的left和right并不是全都存在的,有的時(shí)候會(huì)是個(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?

這種的寫法按層來(lái)處理,當(dāng)獲取到一個(gè)節(jié)點(diǎn)的時(shí)候,這時(shí)我就要拿到他們的子節(jié)點(diǎn),如果現(xiàn)在不獲取子節(jié)點(diǎn)的話在后面是沒有辦法獲取的,當(dāng)這一行結(jié)束的時(shí)候?qū)extRowEndNode賦值給currentRowEndNode,接下來(lái)nextRowEndNode再找下一層的最后一個(gè)節(jié)點(diǎn)。

到此這篇關(guān)于利用go語(yǔ)言實(shí)現(xiàn)查找二叉樹中的最大寬度的文章就介紹到這了,更多相關(guān)go查找二叉樹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語(yǔ)法

    B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語(yǔ)法

    這篇文章主要為大家介紹了B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語(yǔ)法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • golang?metrics各個(gè)指標(biāo)含義講解說明

    golang?metrics各個(gè)指標(biāo)含義講解說明

    這篇文章主要為大家介紹了golang?metrics各個(gè)指標(biāo)含義講解說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 詳解Go語(yǔ)言中for range的

    詳解Go語(yǔ)言中for range的"坑"

    這篇文章主要介紹了詳解Go語(yǔ)言中for range的"坑",文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Go方法簡(jiǎn)單性和高效性的充分體現(xiàn)詳解

    Go方法簡(jiǎn)單性和高效性的充分體現(xiàn)詳解

    本文深入探討了Go語(yǔ)言中方法的各個(gè)方面,包括基礎(chǔ)概念、定義與聲明、特性、實(shí)戰(zhàn)應(yīng)用以及性能考量,文章充滿技術(shù)深度,通過實(shí)例和代碼演示,力圖幫助讀者全面理解Go方法的設(shè)計(jì)哲學(xué)和最佳實(shí)踐
    2023-10-10
  • 一文詳解Golang中的匿名變量

    一文詳解Golang中的匿名變量

    匿名變量是一種特殊類型的變量,可以簡(jiǎn)化代碼并提高可讀性,本文將為大家詳細(xì)介紹一下golang中匿名變量的定義、特性和使用方法,需要的可以參考下
    2023-09-09
  • Golang 中 omitempty的作用

    Golang 中 omitempty的作用

    這篇文章主要介紹了Golang 中 omitempty的作用,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考一下,需要的小伙伴可以參考一下
    2022-07-07
  • golang切片拷貝的實(shí)現(xiàn)

    golang切片拷貝的實(shí)現(xiàn)

    在Golang中,切片的淺拷貝只復(fù)制指向?qū)ο蟮闹羔?而深拷貝則復(fù)制數(shù)據(jù)本身,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • go內(nèi)存緩存BigCache使用入門詳解

    go內(nèi)存緩存BigCache使用入門詳解

    這篇文章主要為大家介紹了go內(nèi)存緩存BigCache使用入門詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Go strconv包實(shí)現(xiàn)字符串和基本數(shù)據(jù)類型轉(zhuǎn)換的實(shí)例詳解

    Go strconv包實(shí)現(xiàn)字符串和基本數(shù)據(jù)類型轉(zhuǎn)換的實(shí)例詳解

    在Go語(yǔ)言(Golang)的編程實(shí)踐中,strconv包是一個(gè)非常重要的標(biāo)準(zhǔn)庫(kù),它提供了在基本數(shù)據(jù)類型(如整型、浮點(diǎn)型、布爾型)和字符串之間的轉(zhuǎn)換功能,本文給大家介紹了關(guān)于Go語(yǔ)言字符串轉(zhuǎn)換strconv,需要的朋友可以參考下
    2024-09-09
  • Go存儲(chǔ)基礎(chǔ)使用direct io方法實(shí)例

    Go存儲(chǔ)基礎(chǔ)使用direct io方法實(shí)例

    這篇文章主要介紹了Go存儲(chǔ)基礎(chǔ)之如何使用direct io方法實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評(píng)論

兴和县| 安庆市| 长沙市| 新野县| 长阳| 保定市| 富锦市| 六盘水市| 阿图什市| 根河市| 阜城县| 横山县| 巴南区| 溆浦县| 嵊泗县| 阿拉尔市| 同心县| 夹江县| 济南市| 阿城市| 隆化县| 攀枝花市| 巨野县| 华池县| 视频| 凤冈县| 涡阳县| 张家川| 拉孜县| 东明县| 富平县| 马尔康县| 故城县| 儋州市| 东城区| 南平市| 巩留县| 平远县| 新干县| 安龙县| 花莲市|