欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用go語(yǔ)言判斷是否是完全二叉樹(shù)

 更新時(shí)間:2022年05月17日 11:58:12   作者:??呆呆燦????  
這篇文章主要介紹了利用go語(yǔ)言判斷是否是完全二叉樹(shù),當(dāng)一個(gè)節(jié)點(diǎn)存在右子節(jié)點(diǎn)但是不存在左子節(jié)點(diǎn)這顆樹(shù)視為非完全二叉樹(shù),通過(guò)利用GO語(yǔ)言判斷來(lái)判斷出否是完全二叉樹(shù),詳細(xì)內(nèi)容參考如下

一、什么是完全二叉樹(shù)?

先看如下這一張圖:

這個(gè)一顆二叉樹(shù),如何區(qū)分該樹(shù)是不是完全二叉樹(shù)呢?

  • 當(dāng)一個(gè)節(jié)點(diǎn)存在右子節(jié)點(diǎn)但是不存在左子節(jié)點(diǎn)這顆樹(shù)視為非完全二叉樹(shù)
  • 當(dāng)一個(gè)節(jié)點(diǎn)的左子節(jié)點(diǎn)存在但是右子節(jié)點(diǎn)不存在視為完全二叉樹(shù)
  • 如果沒(méi)有子節(jié)點(diǎn),那也是要在左側(cè)開(kāi)始到右側(cè)依次沒(méi)有子節(jié)點(diǎn)才視為完全二叉樹(shù),就像上圖2中

而上面第一張圖這顆二叉樹(shù)很明顯是一顆非完全二叉樹(shù),因?yàn)樵诘谌龑右簿褪窃诠?jié)點(diǎn)2它并沒(méi)有右子節(jié)點(diǎn)。在6和4節(jié)點(diǎn)中隔開(kāi)了一個(gè)節(jié)點(diǎn)(2節(jié)點(diǎn)沒(méi)有右子節(jié)點(diǎn)),所以不是完全二叉樹(shù)

再看第二張圖,這顆樹(shù)就是一個(gè)完全二叉樹(shù),雖然在這個(gè)顆節(jié)點(diǎn)3沒(méi)有右子節(jié)點(diǎn),但是6 4 5節(jié)點(diǎn)之間并沒(méi)有空缺的子節(jié)點(diǎn),這里就解釋了上面說(shuō)的第三條(如何沒(méi)有子節(jié)點(diǎn),那也是在左側(cè)開(kāi)始到右側(cè)依次沒(méi)有子節(jié)點(diǎn)才視為完全二叉樹(shù))

二、流程

這道題可以使用按層遍歷的方式來(lái)解決:

  • 首先準(zhǔn)備一個(gè)隊(duì)列,按層遍歷使用隊(duì)列是最好的一種解決方法
  • 首先將頭節(jié)點(diǎn)加入到隊(duì)列里面(如果頭節(jié)點(diǎn)為空,你可以認(rèn)為它是一個(gè)非完全二叉樹(shù)也可以認(rèn)為它是完全二叉樹(shù))
  • 遍歷該隊(duì)列跳出遍歷的條件是直到這個(gè)隊(duì)列為空時(shí)
  • 這個(gè)時(shí)候需要準(zhǔn)備一個(gè)Bool的變量,如果當(dāng)一個(gè)節(jié)點(diǎn)的左子節(jié)點(diǎn)或者右子節(jié)點(diǎn)不存在時(shí)將其置成true
  • 當(dāng)Bool變量為true并且剩余節(jié)點(diǎn)的左或右子節(jié)點(diǎn)不為空該樹(shù)就是非完全二叉樹(shù)
  • 當(dāng)一樹(shù)的左子節(jié)點(diǎn)不存在并且右子節(jié)點(diǎn)存在,該樹(shù)也是非完全二叉樹(shù)

三、代碼

1.樹(shù)節(jié)點(diǎn)

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

2.測(cè)試代碼

func main() {
	root := &TreeNode{val: "1"}
	root.left = &TreeNode{val: "2"}
	root.left.left = &TreeNode{val: "4"}
	root.left.right = &TreeNode{val: "10"}
	root.left.left.left = &TreeNode{val: "7"}
	root.right = &TreeNode{val: "3"}
	root.right.left = &TreeNode{val: "5"}
	root.right.right = &TreeNode{val: "6"}
	if IsCompleteBt(root) {
		fmt.Println("是完全二叉樹(shù)")
	} else {
		fmt.Println("不是完全二叉樹(shù)")
	}
}

3.判斷樹(shù)是否為完全二叉樹(shù)代碼

// IsCompleteBt 這里默認(rèn)根節(jié)點(diǎn)為空屬于完全二叉樹(shù),這個(gè)可以自已定義是否為完全二叉樹(shù)/***/
func IsCompleteBt(root *TreeNode) bool {
	if root == nil {
		return true
	}

	/**
	* 條件:
	* 	1.當(dāng)一個(gè)節(jié)點(diǎn)存在右子節(jié)點(diǎn)但是不存在左子節(jié)點(diǎn)這顆樹(shù)視為非完全二叉樹(shù)
	*	2.當(dāng)一個(gè)節(jié)點(diǎn)的左子節(jié)點(diǎn)存在但是右子節(jié)點(diǎn)不存在視為完全二叉樹(shù)
	 */
	var tempNodeQueue []*TreeNode

	tempNodeQueue = append(tempNodeQueue, root)

	var tempNode *TreeNode
	isSingleNode := false
	for len(tempNodeQueue) != 0 {
		tempNode = tempNodeQueue[0]
		tempNodeQueue = tempNodeQueue[1:]

		if (isSingleNode && (tempNode.left != nil || tempNode.right != nil)) || (tempNode.left == nil && tempNode.right != nil){
			return false
		}

		if tempNode.left != nil{
			tempNodeQueue = append(tempNodeQueue,tempNode.left)
		}else{
			isSingleNode = true
		}

		if  tempNode.right != nil {
			tempNodeQueue = append(tempNodeQueue, tempNode.right)
		}else{
			isSingleNode = true
		}
	}
	return true
}

4.代碼解讀

這段代碼里面沒(méi)有多少好說(shuō)的,就說(shuō)下for里面第一個(gè)if判斷叭

這里看下上面流程中最后兩個(gè)條件,當(dāng)滿(mǎn)足最后兩個(gè)條件的時(shí)候才可以判斷出來(lái)這顆樹(shù)是否是完全二叉樹(shù).

同樣因?yàn)閷?shí)現(xiàn)判斷是否是完全二叉樹(shù)是通過(guò)對(duì)樹(shù)的按層遍歷來(lái)處理的,因?yàn)閷?duì)樹(shù)的按層遍歷通過(guò)隊(duì)列是可以間單的實(shí)現(xiàn)的。所以這里使用到了隊(duì)列

至于這里為什么要單獨(dú)創(chuàng)建一個(gè)isSingleNode變量:

  • 因?yàn)楫?dāng)有一個(gè)節(jié)點(diǎn)左側(cè)節(jié)點(diǎn)或者是右側(cè)的節(jié)點(diǎn)沒(méi)有的時(shí)候,在這同一層后面如果還有不為空的節(jié)點(diǎn)時(shí),那么這顆樹(shù)便不是完全二叉樹(shù),看下圖

在這顆樹(shù)的最后一層綠色涂鴨處是少一個(gè)節(jié)點(diǎn)的,所以我用了一個(gè)變量我標(biāo)識(shí)當(dāng)前節(jié)點(diǎn)(在上圖表示節(jié)點(diǎn)2)的子節(jié)點(diǎn)是不是少一個(gè),如果少了當(dāng)前節(jié)點(diǎn)(在上圖表示節(jié)點(diǎn)2)的下一個(gè)節(jié)點(diǎn)(在上圖表示節(jié)點(diǎn)3)的子節(jié)點(diǎn)(在上圖表示4和5)如果存在則不是完全二叉樹(shù),所以這就是創(chuàng)建了一個(gè)isSingleNode變量的作用

5.運(yùn)行結(jié)果

到此這篇關(guān)于利用go語(yǔ)言判斷是否是完全二叉樹(shù)的文章就介紹到這了,更多相關(guān)go 二叉樹(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang中fsnotify包監(jiān)聽(tīng)文件變化的原理詳解

    Golang中fsnotify包監(jiān)聽(tīng)文件變化的原理詳解

    Golang提供了一個(gè)強(qiáng)大的fsnotify包,它能夠幫助我們輕松實(shí)現(xiàn)文件系統(tǒng)的監(jiān)控,本文將深入探討fsnotify包的原理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • Go singleflight使用以及原理

    Go singleflight使用以及原理

    singleflight官方解釋其為:singleflight提供了一個(gè)重復(fù)的函數(shù)調(diào)用抑制機(jī)制。通俗的解釋其作用是,若有多個(gè)協(xié)程運(yùn)行某函數(shù)時(shí),只讓一個(gè)協(xié)程去處理,然后批量返回。非常適合來(lái)做并發(fā)控制。常見(jiàn)用于緩存穿透的情況
    2023-01-01
  • Golang 獲取文件md5校驗(yàn)的方法以及效率對(duì)比

    Golang 獲取文件md5校驗(yàn)的方法以及效率對(duì)比

    這篇文章主要介紹了Golang 獲取文件md5校驗(yàn)的方法以及效率對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • 一百行Golang代碼實(shí)現(xiàn)簡(jiǎn)單并發(fā)聊天室

    一百行Golang代碼實(shí)現(xiàn)簡(jiǎn)單并發(fā)聊天室

    這篇文章主要為大家詳細(xì)介紹了一百行Golang代碼如何實(shí)現(xiàn)簡(jiǎn)單并發(fā)聊天室,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Golang學(xué)習(xí)筆記(六):struct

    Golang學(xué)習(xí)筆記(六):struct

    這篇文章主要介紹了Golang學(xué)習(xí)筆記(六):struct,本文講解了struct的聲明及初始化、struct的匿名字段(繼承)、method、method繼承和重寫(xiě)等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • GO語(yǔ)言實(shí)現(xiàn)二維碼掃碼的示例代碼

    GO語(yǔ)言實(shí)現(xiàn)二維碼掃碼的示例代碼

    你對(duì)二維碼掃碼的流程有困惑嗎,這篇文章就結(jié)合筆者自身的開(kāi)發(fā)經(jīng)驗(yàn)進(jìn)行分享,讓大家熟悉并掌握此功能,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2023-06-06
  • go語(yǔ)言通過(guò)odbc操作Access數(shù)據(jù)庫(kù)的方法

    go語(yǔ)言通過(guò)odbc操作Access數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了go語(yǔ)言通過(guò)odbc操作Access數(shù)據(jù)庫(kù)的方法,實(shí)例分析了Go語(yǔ)言通過(guò)odbc連接、查詢(xún)與關(guān)閉access數(shù)據(jù)庫(kù)的技巧,需要的朋友可以參考下
    2015-03-03
  • mac下安裝golang框架iris的方法

    mac下安裝golang框架iris的方法

    這篇文章主要介紹了mac下安裝golang框架iris的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Go語(yǔ)言kafka生產(chǎn)消費(fèi)消息實(shí)例搬磚

    Go語(yǔ)言kafka生產(chǎn)消費(fèi)消息實(shí)例搬磚

    這篇文章主要為大家介紹了Go語(yǔ)言kafka生產(chǎn)消費(fèi)消息的實(shí)例搬磚,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go中過(guò)濾范型集合性能示例詳解

    Go中過(guò)濾范型集合性能示例詳解

    這篇文章主要為大家介紹了Go中過(guò)濾范型集合性能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評(píng)論