劍指 Offer 26. 樹的子結構(中等)
阿新 • • 發佈:2021-08-16
通過率46.4%
題目描述:
輸入兩棵二叉樹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,1]
輸出:false
示例 2:
輸入:A = [3,4,5,1,2], B = [4,1]
輸出:true
限制:
0 <= 節點個數 <= 10000
思路:
這題沒有明確的思路,然後看了Krahets大神的題解
不能清楚地說出自己的理解的話,那這種邏輯思維就無法吸收為自己的,現在,要用我自己的話理一理思路(貌似沒有大神的好懂...不過自己看看就好(#^.^#)):
- 遍歷A樹的每個節點,判斷以該節點為根節點的樹是否包含B樹(即呼叫函式isSubStructure)
- 若該節點的val值等於B的根節點的val值,則遞迴判斷以該節點為根節點的樹是否能與B樹匹配(呼叫函式sub)
也就是說,每遍歷一個節點,都呼叫isSubStructure(node.left/right, B);一旦遇到node.val === B.val的情況,就先呼叫sub(node, B),真正能判斷A樹中是否包含B樹的其實是sub()函式
1 /*JavaScript*/ 2 /** 3 * Definition for a binary tree node. 4 * function TreeNode(val) { 5 * this.val = val; 6 * this.left = this.right = null; 7 * } 8 */ 9 /** 10 * @param {TreeNode} A 11 * @param {TreeNode} B 12 * @return {boolean} 13 */ 14 var sub = function(x, y) { 15 if(!y) return true //B樹已走到葉子節點,說明x包含y 16 if(!x || x.val !== y.val) return false //B未走到葉子節點而A已走到葉子節點 或者 值不等 17 return sub(x.left, y.left) && sub(x.right, y.right) //值相等,則判斷左右子樹是否能匹配 18 } 19 20 var isSubStructure = function(A, B) { 21 if(!A || !B) return false //A或B為空樹 22 return A.val === B.val && sub(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B) 23 };