26 樹的子結構

2021-10-20 20:14:42 字數 2944 閱讀 5460

擴充套件題:leetcode572 另乙個樹的子樹

572. 另乙個樹的子樹

輸入兩棵二叉樹ab,判斷b是不是a的子結構。(約定空樹不是任意乙個樹的子結構)

ba的子結構, 即a中有出現和b相同的結構和節點值。

例如:給定的樹a:

3

/ \ 4

5/ \

12

給定的樹b

4

/1

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

示例 1:

輸入:a = [1,2,3], b = [3,1]

輸出:false

示例 2:

輸入:a = [3,4,5,1,2], b = [4,1]

輸出:true

限制:0 <= 節點個數 <= 10000在樹a中查詢與樹b根節點一樣的節點,這實際就是樹的遍歷。樹的遍歷可以用遞迴迴圈的方式,由於遞迴比較簡潔,所以面試的時候沒有特別要求,通常我們會採用遞迴的方式。

判斷由第一步在a中找到的節點作為根節點,和樹b是否具有相同的結構。同樣是用遞迴的方式。

**分為兩個部分:

遍歷樹a中的所有非空節點r

判斷樹a中以r為根節點的子樹是不是包含和樹b一樣的結構,且我們從根節點開始匹配;

對於第一部分,我們直接遞迴遍歷樹a即可,遇到非空節點後,就進行第二部分的判斷。

對於第二部分,我們同時從根節點開始遍歷兩棵子樹:

注:在寫遍歷樹的**的時候,一定要高度的警惕,在每一處需要訪問位址的時候都要問自己這個位址有沒有可能是null,如果是null該怎麼處理。如果沒有檢查並進行相應的處理,則程式非常容易崩潰,這是非常忌諱的事情。

給定兩個非空二叉樹st,檢驗s中是否包含和t具有相同結構和節點值的子樹。s的乙個子樹包括s的乙個節點和這個節點的所有子孫。s也可以看做它自身的一棵子樹。

示例 1:

給定的樹s:

3

/ \ 4

5/ \

12

給定的樹t

4

/ \ 1

2

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

示例 2:

給定的樹s

3

/ \ 4

5/ \ 12

/0

給定的樹t

4

/ \ 1

2

返回false

可以看到本題與上題還是稍有不同的,這題需要的是之後的所有節點全部相等,且包含的個數也需一樣,如本題示例2需要返回false,如果放到上題,本題的示例2需要返回true

解:思路和上題一樣,只是最後判斷是否是數的子結構的終止條件變了而已。

26 樹的子結構

輸入兩棵二叉樹a和b,判斷b是不是a的子結構。約定空樹不是任意乙個樹的子結構 b是a的子結構,即 a中有出現和b相同的結構和節點值。例如 給定的樹 a 3 4 5 1 2 給定的樹 b 4 1 返回 true,因為 b 與 a 的乙個子樹擁有相同的結構和節點值。示例 1 輸入 a 1,2,3 b 3...

26 樹的子結構

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 思路 遍歷樹a中的節點,看與樹b根節點的值是否相等,相等的話,遞迴比較左右子樹。不相等的話,接著遍歷樹a。樹的遍歷也是使用遞迴的方式進行實現。需要注意的是,由於空樹不是任意乙個樹的子結構,所以只有當兩樹都不為空時...

面試題26 樹的子結構

題目 輸入兩棵二叉樹a和b,判斷b是不是a的子結構。includeusing namespace std struct binarytreenode bool doestree1hastree2 binarytreenode proot1,binarytreenode proot2 bool equ...