No amount of money ever bought a second of time.
web
再多的錢也沒法買回逝去的光陰。算法
問題描述微信
輸入兩棵二叉樹A和B,判斷B是否是A的子結構。(約定空樹不是任意一個樹的子結構)數據結構
B是A的子結構, 即A中有出現和B相同的結構和節點值。app
例如:數據結構和算法
給定的樹 A:編輯器
3svg
/ \url
4 5spa
/ \
1 2
給定的樹 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
問題分析
要判斷B是不是A的子結構,像下面這樣,咱們只須要從根節點開始判斷,經過遞歸的方式比較他的每個子節點便可,因此代碼也很容易寫
1public boolean isSubStructure(TreeNode A, TreeNode B) {
2 //邊界條件判斷,若是A和B有一個爲空,返回false
3 if (A == null || B == null)
4 return false;
5 return isSub(A, B);
6}
7
8boolean isSub(TreeNode A, TreeNode B) {
9 //這裏若是B爲空,說明B已經訪問完了,肯定是A的子結構
10 if (B == null)
11 return true;
12 //若是B不爲空A爲空,或者這兩個節點值不一樣,說明B樹不是
13 //A的子結構,直接返回false
14 if (A == null || A.val != B.val)
15 return false;
16 //當前節點比較完以後還要繼續判斷左右子節點
17 return isSub(A.left, B.left) && isSub(A.right, B.right);
18}
但實際上B若是是A的子結構的話,不必定是從根節點開始的,也多是下面這樣
也就是說B不光有多是A的子結構,也有多是A左子樹的子結構或者右子樹的子結構,因此若是從根節點判斷B不是A的子結構,還要繼續判斷B是否是A左子樹的子結構和右子樹的子結構,代碼以下
1public boolean isSubStructure(TreeNode A, TreeNode B) {
2 if (A == null || B == null)
3 return false;
4 //先從根節點判斷B是否是A的子結構,若是不是在分別從左右兩個子樹判斷,
5 //只要有一個爲true,就說明B是A的子結構
6 return isSub(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
7}
8
9boolean isSub(TreeNode A, TreeNode B) {
10 //這裏若是B爲空,說明B已經訪問完了,肯定是A的子結構
11 if (B == null)
12 return true;
13 //若是B不爲空A爲空,或者這兩個節點值不一樣,說明B樹不是
14 //A的子結構,直接返回false
15 if (A == null || A.val != B.val)
16 return false;
17 //當前節點比較完以後還要繼續判斷左右子節點
18 return isSub(A.left, B.left) && isSub(A.right, B.right);
19}
總結
B是A的子結構不必定是從根節點開始判斷B是不是A的子結構,也有可能B是A左子樹或右子樹的子結構,因此若是從根節點判斷B不是A的子結構的時候還要分別判斷A的子樹中是否包含B。
![](http://static.javashuo.com/static/loading.gif)
長按上圖,識別圖中二維碼以後便可關注。
若是以爲有用就點個"贊"吧
本文分享自微信公衆號 - 數據結構和算法(sjjghsf)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。