二叉樹的子結構 深度以及重建二叉樹

2022-07-29 06:27:13 字數 2531 閱讀 1545

二叉樹相關的套路,除了四種遍歷方式,還有很多的內容,有二叉樹的深度,將乙個陣列構建成為乙個二叉樹。

今天接著搞定二叉樹。

劍指offer第55-i題,leetcode第104題:

輸入一棵二叉樹的根節點,求該樹的深度。從根節點到葉節點依次經過的節點(含根、葉節點)形成樹的一條路徑,

最長路徑的長度為樹的深度。

例如:給定二叉樹[3,9,20,null,null,15,7],返會他的最大深度。

3

/ \9 20

/ \

15 7

二叉樹的深度,說白了就是二叉樹有幾層,因此可以使用層序遍歷,統計有多少層即可:

使用層序遍歷的方法:

public int maxdepth(treenode root)
時間複雜度:遍歷了所有的樹的節點,o(n)

空間複雜度:當樹退化成單鏈,則遞迴的深度為n,因此空間複雜度o(n)

平衡二叉樹定義:如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。

劍指offer第55-ii題,leetcode第110題:

輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。

平衡二叉樹的概念講的很清楚,要求任意一節點的左右子樹的深度差不能超過1,那麼分別求出每個子樹的

左右子樹的深度,求差即可判斷:

public boolean isbalanced(treenode root)
上面**計算判斷每乙個節點開始的二叉樹都會判斷他的所有子樹是不是平衡二叉樹,進行了大量的重複計算,那如何省去這些重複的計算呢?

答案是從葉結點開始計算,判斷每乙個葉結點為根的子樹,是平衡樹則返回他的樹高,如果不是則返回-1,然後對其父父節點為根的子樹,使用返回的樹高進行計算。

public boolean isbalanced2(treenode root)

public int recur(treenode root)

劍指offer第26題:

輸入兩棵二叉樹a和b,判斷b是不是a的子結構。(約定空樹不是任意乙個樹的子結構),b是a的子結構, 即 a中有出現和b相同的結構和節點值。

例如:

給定的樹 a:

3/ \

4 5

/ \1 2

給定的樹 b:

4 / 1

返回 true,因為 b 與 a 的乙個子樹擁有相同的結構和節點值。

這個題我第一反應,要用a樹種的每乙個節點作為a的某棵子樹的根節點和b進行比較。

所以我覺得需要用個佇列或者棧或者列表將遍歷整個樹得到的元素儲存起來,再一一判斷。

但是我已經遍歷樂一遍了,在遍歷的時候遍歷到當前節點就對以當前節點為根的子樹進行判斷,不好嗎?

public boolean issubstructure(treenode a, treenode b)

//從a的根和b的跟開始判斷是不是一樣的結構

//這句話不知道怎麼描述

public boolean help(treenode a, treenode b)

二叉樹的重建,嗯。。。想起來挺簡單,做起來挺不簡單的。。。

劍指offer第7題,leetcode第105題:

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。

例如:

前序遍歷 preorder = [3,9,20,15,7]

中序遍歷 inorder = [9,3,15,20,7]

返回如下二叉樹

3/ \

9 20

/ \

15 7

怎麼說,剛看到這個題目一臉茫然,好像大學學過,但是呢,,,嗯學的慘不忍睹。。。

至此,可以將中序便利的陣列分為三部分,根節點,左子樹和右子樹,對於左右子樹,他們又是乙個完成的樹結構,重複以上方法即可。

什麼意思呢?對於上面的題目:

前序遍歷 preorder = [3,9,20,15,7]

中序遍歷 inorder = [9,3,15,20,7]

根據前序遍歷可以得到根節點是3

將中序遍歷的結果分為3部分 左子樹[9],根節點[3],右子樹[15,20,7]

3/ \

9 [15,20,7]

在前序遍歷中對應的[15,20,7]的遍歷結果是[20,15,7]

重複上述過程則有

3/ \

9 20

/ \

15 7

上**:

public treenode buildtree(int preorder, int inorder)
對於樹的各種操作分治思想是乙個很奇妙的思想,要判斷一整棵樹,可以先判斷左右子樹,依次遞迴,注意遞迴退出的邊界條件。

二叉樹 重建二叉樹

問題 給定二叉樹的前序遍歷結果和中序遍歷結果,恢復出原二叉樹。假設二叉樹中的元素都不重複,給定二叉樹的前序遍歷序列,二叉樹的中序遍歷序列。看到此題,我首先想到的是尋找根節點,由前序遍歷序列可以看出根節點為1,此時通過中序遍歷可以看出來4,7,2在根節點的左子樹,5,3,8,6在樹的右節點。此時我們可...

二叉樹 重建二叉樹

題目給定兩個陣列,乙個是前序遍歷陣列 preorder 乙個是中序遍歷陣列 inorder 要求輸出還原二叉樹 核心在於我們要理解前序和中序便利的特點 前序遍歷 根節點 左節點 右節點 中序遍歷 左節點 根節點 右節點 所以我們從二叉樹的根節點開始重構 也就是preorder的第乙個值 同時用乙個m...

重建二叉樹python 資料結構 重建二叉樹

說明 給定輸入一棵二叉樹的前序遍歷和中序遍歷陣列。利用此重新建立二叉樹。注意輸入不包含相同的鍵值,否則情況複雜得多。思路 由定義,前序遍歷的第乙個記錄總是根節點,而這個鍵值在中序遍歷時,將中序遍歷的陣列分成兩部分,分別對應這個根節點的左右兩子樹。同時,前序遍歷陣列跟在節點後的陣列也分成兩部分,其中前...