1. 程式人生 > 其它 >劍指 Offer 26. 樹的子結構(中等)

劍指 Offer 26. 樹的子結構(中等)

通過率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 };