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

利用go語言判斷是否是完全二叉樹

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

一、什么是完全二叉樹?

先看如下這一張圖:

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

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

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

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

二、流程

這道題可以使用按層遍歷的方式來解決:

  • 首先準(zhǔn)備一個(gè)隊(duì)列,按層遍歷使用隊(duì)列是最好的一種解決方法
  • 首先將頭節(jié)點(diǎn)加入到隊(duì)列里面(如果頭節(jié)點(diǎn)為空,你可以認(rèn)為它是一個(gè)非完全二叉樹也可以認(rèn)為它是完全二叉樹)
  • 遍歷該隊(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)不為空該樹就是非完全二叉樹
  • 當(dāng)一樹的左子節(jié)點(diǎn)不存在并且右子節(jié)點(diǎn)存在,該樹也是非完全二叉樹

三、代碼

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

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

2.測試代碼

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("是完全二叉樹")
	} else {
		fmt.Println("不是完全二叉樹")
	}
}

3.判斷樹是否為完全二叉樹代碼

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

	/**
	* 條件:
	* 	1.當(dāng)一個(gè)節(jié)點(diǎn)存在右子節(jié)點(diǎn)但是不存在左子節(jié)點(diǎn)這顆樹視為非完全二叉樹
	*	2.當(dāng)一個(gè)節(jié)點(diǎn)的左子節(jié)點(diǎn)存在但是右子節(jié)點(diǎn)不存在視為完全二叉樹
	 */
	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.代碼解讀

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

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

同樣因?yàn)閷?shí)現(xiàn)判斷是否是完全二叉樹是通過對(duì)樹的按層遍歷來處理的,因?yàn)閷?duì)樹的按層遍歷通過隊(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)沒有的時(shí)候,在這同一層后面如果還有不為空的節(jié)點(diǎn)時(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)如果存在則不是完全二叉樹,所以這就是創(chuàng)建了一個(gè)isSingleNode變量的作用

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

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

相關(guān)文章

  • golang?cache帶索引超時(shí)緩存庫實(shí)戰(zhàn)示例

    golang?cache帶索引超時(shí)緩存庫實(shí)戰(zhàn)示例

    這篇文章主要為大家介紹了golang?cache帶索引超時(shí)緩存庫實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 使用Go語言實(shí)現(xiàn)心跳機(jī)制

    使用Go語言實(shí)現(xiàn)心跳機(jī)制

    心跳最典型的應(yīng)用場景是是探測服務(wù)是否存活,這篇文章主要來和大家介紹一下如何使用Go語言實(shí)現(xiàn)一個(gè)簡單的心跳程序,感興趣的可以了解下
    2024-01-01
  • Golang技巧之重試機(jī)制詳解

    Golang技巧之重試機(jī)制詳解

    重試機(jī)制是一種在程序執(zhí)行過程中出現(xiàn)錯(cuò)誤后重新嘗試執(zhí)行程序的一種機(jī)制,可以減少程序運(yùn)行過程中出現(xiàn)的錯(cuò)誤,從而提高程序的可靠性,本文就來講講Golang中是如何實(shí)現(xiàn)重試機(jī)制的吧
    2023-05-05
  • Go語言開發(fā)前后端不分離項(xiàng)目詳解

    Go語言開發(fā)前后端不分離項(xiàng)目詳解

    這篇文章主要為大家介紹了Go語言開發(fā)前后端不分離項(xiàng)目詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Go中string與[]byte高效互轉(zhuǎn)的方法實(shí)例

    Go中string與[]byte高效互轉(zhuǎn)的方法實(shí)例

    string與[]byte經(jīng)常需要互相轉(zhuǎn)化,普通轉(zhuǎn)化會(huì)發(fā)生底層數(shù)據(jù)的復(fù)制,下面這篇文章主要給大家介紹了關(guān)于Go中string與[]byte高效互轉(zhuǎn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • Golang內(nèi)存分配機(jī)制詳解

    Golang內(nèi)存分配機(jī)制詳解

    Go 語言的內(nèi)存分配機(jī)制是理解和優(yōu)化 Go 程序性能的關(guān)鍵,在 Go 中,內(nèi)存管理是自動(dòng)進(jìn)行的,這得益于 Go 的垃圾回收機(jī)制,了解內(nèi)存如何分配和回收,可以幫助我們寫出更高性能的代碼,本文將深入講解下 Go 內(nèi)存分配機(jī)制,需要的朋友可以參考下
    2023-12-12
  • 關(guān)于golang test緩存問題

    關(guān)于golang test緩存問題

    這篇文章主要介紹了關(guān)于golang test緩存問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Go實(shí)現(xiàn)Redis連接池方法

    Go實(shí)現(xiàn)Redis連接池方法

    為了更深入了解golang連接池的實(shí)現(xiàn),自已又重寫了一遍連接池。文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Go語言Elasticsearch數(shù)據(jù)清理工具思路詳解

    Go語言Elasticsearch數(shù)據(jù)清理工具思路詳解

    這篇文章主要介紹了Go語言Elasticsearch數(shù)據(jù)清理工具思路詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • GO語言操作Elasticsearch示例分享

    GO語言操作Elasticsearch示例分享

    這篇文章主要介紹了GO語言操作Elasticsearch示例分享的相關(guān)資料,需要的朋友可以參考下
    2023-01-01

最新評(píng)論

阿拉善左旗| 吉水县| 绥江县| 泰和县| 玛沁县| 三河市| 鞍山市| 保德县| 格尔木市| 辽中县| 新乐市| 霍州市| 泊头市| 沙湾县| 武隆县| 武鸣县| 北碚区| 鸡东县| 尼勒克县| 白水县| 衢州市| 石泉县| 临海市| 剑川县| 辉南县| 旬邑县| 五常市| 河池市| 清河县| 湖口县| 广河县| 永春县| 平塘县| 锡林浩特市| 榆中县| 辽源市| 万源市| 宁蒗| 吴旗县| 汾阳市| 靖安县|