擴充套件題:leetcode572 另乙個樹的子樹
572. 另乙個樹的子樹
輸入兩棵二叉樹a
和b
,判斷b
是不是a
的子結構。(約定空樹不是任意乙個樹的子結構)
b
是a
的子結構, 即a
中有出現和b
相同的結構和節點值。
例如:給定的樹a
:
3
/ \ 4
5/ \
12
給定的樹b
:
4
/1
返回true
,因為b
與a
的乙個子樹擁有相同的結構和節點值。
示例 1:
輸入:a = [1,2,3], b = [3,1]示例 2:輸出:false
輸入:a = [3,4,5,1,2], b = [4,1]限制:輸出:true
0 <= 節點個數 <= 10000
在樹a
中查詢與樹b
根節點一樣的節點,這實際就是樹的遍歷。樹的遍歷可以用遞迴
和迴圈
的方式,由於遞迴
比較簡潔,所以面試的時候沒有特別要求,通常我們會採用遞迴
的方式。
判斷由第一步在a
中找到的節點作為根節點,和樹b
是否具有相同的結構。同樣是用遞迴的方式。
**分為兩個部分:
遍歷樹a
中的所有非空節點r
;
判斷樹a
中以r
為根節點的子樹是不是包含和樹b
一樣的結構,且我們從根節點開始匹配;
對於第一部分
,我們直接遞迴遍歷樹a
即可,遇到非空節點後,就進行第二部分的判斷。
對於第二部分
,我們同時從根節點開始遍歷兩棵子樹:
注:
在寫遍歷樹的**的時候,一定要高度的警惕,在每一處需要訪問位址的時候都要問自己這個位址有沒有可能是null
,如果是null
該怎麼處理。如果沒有檢查並進行相應的處理,則程式非常容易崩潰,這是非常忌諱的事情。
給定兩個非空二叉樹s
和t
,檢驗s
中是否包含和t
具有相同結構和節點值的子樹。s
的乙個子樹包括s
的乙個節點和這個節點的所有子孫。s
也可以看做它自身的一棵子樹。
示例 1:
給定的樹s
:
3
/ \ 4
5/ \
12
給定的樹t
:
4
/ \ 1
2
返回true
,因為t
與s
的乙個子樹擁有相同的結構和節點值。
示例 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...