?劍指 Offer 26. 樹的子結(jié)構(gòu)
難度:中等
輸入兩棵二叉樹 A
和 B
,判斷 B
是不是 A
的子結(jié)構(gòu)。(約定空樹不是任意一個樹的子結(jié)構(gòu))
B
是 A
的子結(jié)構(gòu), 即 A
中有出現(xiàn)和B相同的結(jié)構(gòu)和節(jié)點值。
例如:
給定的樹 A
:
3
/ \
4 5
/ \
1 2
給定的樹 B
:
4
/
1
返回 true
,因為 B
與 A
的一個子樹擁有相同的結(jié)構(gòu)和節(jié)點值。
示例 1:
輸入:A = [1,2,3], B = [3,1]
輸出:false
示例 2:
輸入:A = [3,4,5,1,2], B = [4,1]
輸出:true
限制:
0 <= 節(jié)點個數(shù) <= 10000
??思路:遞歸
二叉樹 B
為 A
的子結(jié)構(gòu)的情況一共有三種,滿足其中一種即可:
- 子結(jié)構(gòu)
B
的起點為A
的根節(jié)點,即從A
的根節(jié)點開始和B
比較, 調(diào)用函數(shù)isSubStree
:- 不相等,則返回
false
; - 相等,則再比較 左子樹和右子樹都是否相等,都相等,才返回
true
- 不相等,則返回
- 子結(jié)構(gòu)
B
在A
的左子樹中,即B
的起點隱藏在A
的左子樹中,此時調(diào)用函數(shù)isSubStructure
; - 子結(jié)構(gòu)
B
在A
的右子樹中,即B
的起點隱藏在A
的右子樹中,此時調(diào)用函數(shù)isSubStructure
。
??代碼:(C++、Java)
C++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
bool isSubStree (TreeNode* root1, TreeNode* root2){
if(root2 == nullptr) return true;
if(root1 == nullptr) return false;
if(root1->val != root2->val) return false;
return isSubStree(root1->left, root2->left) && isSubStree(root1->right, root2->right);
}
public:
bool isSubStructure(TreeNode* A, TreeNode* B) {
if(A == nullptr || B == nullptr) return false;
return isSubStree(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B);
}
};
Java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private boolean isSubStree (TreeNode root1, TreeNode root2){//從當前根節(jié)點直接比較
if(root2 == null) return true;
if(root1 == null) return false;
if(root1.val != root2.val) return false;
return isSubStree(root1.left, root2.left) && isSubStree(root1.right, root2.right);
}
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A == null || B == null) return false;
return isSubStree(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
}
}
?? 運行結(jié)果:
?? 復雜度分析:
-
時間復雜度:
O
(
n
m
)
O(nm)
O(nm),其中
n
和m
分別表示兩棵樹的節(jié)點數(shù),我們要對每個A
樹節(jié)點進行訪問,最壞情況下每次都要比較B
樹節(jié)點的次數(shù)。 - 空間復雜度: O ( n + m ) O(n + m) O(n+m),兩個遞歸棧深度相乘(當樹退化成鏈表時,遞歸棧最大)。
題目來源:力扣。文章來源:http://www.zghlxwxcb.cn/news/detail-616928.html
放棄一件事很容易,每天能堅持一件事一定很酷,一起每日一題吧!
關注我LeetCode主頁 / CSDN—力扣專欄,每日更新!文章來源地址http://www.zghlxwxcb.cn/news/detail-616928.html
注: 如有不足,歡迎指正!
到了這里,關于(樹) 劍指 Offer 26. 樹的子結(jié)構(gòu) ——【Leetcode每日一題】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!