劍指 offer 26. 樹的子結構
輸入兩棵二叉樹a和b,判斷b是不是a的子結構。(約定空樹不是任意乙個樹的子結構)
b是a的子結構, 即 a中有出現和b相同的結構和節點值。
例如:給定的樹 a:
3/ \
45/ \ 12
給定的樹 b:
4/1返回 true,因為 b 與 a 的乙個子樹擁有相同的結構和節點值。
示例 1:
輸入:a =[1
,2,3
], b =[3
,1]輸出:false
示例 2:
輸入:a =[3
,4,5
,1,2
], b =[4
,1]輸出:true
限制:0
<= 節點個數 <=
10000
遞迴(已ac)
思路如下
issubstructure 先序遍歷
因為判斷樹結構相同也是個遞迴的過程,我們遍歷b的節點nodeb並且與a對應節點nodea比較,有以下四種情況
1.nodeb為空,nodea不為空,這是允許的,返回true
2.nodeb為空, nodea為空,這也是允許的,返回true
3.nodeb不為空,nodea不為空,那麼比較這兩個值是否相等,相等則判斷子樹結構是否相同,否則返回false
4.nodeb不為空,nodea為空,那麼b就不是a的子結構,返回false
情況12可以合在一起,可以看到與issubstructure的終止條件有些差異,因此將判斷樹結構另寫乙個方法check()
差異的產生在於題目上規定了空樹不是任意乙個樹的子結構,這與我們判斷樹結構時的判據12正好相反
另乙個值得注意的點是issubstructure的遞迴函式部分,如果不仔細思考,很可能就使用check方法,與上述類似,情況124與
issubstructure的終止條件:當ab任意乙個為空時返回false
是不相同的,失去了issubstructure先序遍歷的結構,因此不一定會遍歷到所有a節點
那麼check實際上是個傳入的節點ab的值已經相等,判斷b的其他結構是否和a中對應的方法
時間mn,m為a中節點個數,n為b中節點個數,每遍歷到乙個a中節點,就要判斷是否與b中節點情況相同,最壞情況下每個節點都要判斷,因此為相乘
空間m, 最壞情況下ab都為鍊錶,因為是在a中找b,a結束那麼尋找過程也結束
/**
* definition for a binary tree node.
* public class treenode
* }*/class
solution
boolean
check
(treenode a, treenode b)
}
如上 劍指offer26 樹的子結構
輸入兩棵二叉樹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,...
劍指 Offer 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,...
劍指 Offer 26 樹的子結構
輸入兩棵二叉樹a和b,判斷b是不是a的子結構。約定空樹不是任意乙個樹的子結構 b是a的子結構,即 a中有出現和b相同的結構和節點值。例如 給定的樹 a 3 4 5 1 2 給定的樹 b 4 1返回 true,因為 b 與 a 的乙個子樹擁有相同的結構和節點值。definition for a bin...