572. 另一個樹的子樹
給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。
示例 1:
給定的樹 s:3 / \ 4 5 / \ 1 2給定的樹 t:
4 / \ 1 2返回 true,因爲 t 與 s 的一個子樹擁有相同的結構和節點值。
示例 2:
給定的樹 s:3 / \ 4 5 / \ 1 2 / 0給定的樹 t:
4 / \ 1 2返回 false。
解法一
/**
* 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 {
public:
bool comp(TreeNode* s, TreeNode* t) {
if(!s && !t) return true;
if(!s && t || s && !t) return false;
if(s->val != t->val) return false;
return comp(s->left, t->left) && comp(s->right, t->right);
}
bool isSubtree(TreeNode* s, TreeNode* t) {
if(!s && !t) return true;
if(!s && t || s && !t) return false;
if(comp(s, t)) return true;
return isSubtree(s->left, t) || isSubtree(s->right, t);
}
};
思路:
雙重遞歸。主函數isSubtree遞歸地遍歷s的每個結點,在遍歷過程中,比較以當前結點爲根的樹與樹t比較;函數comp則比較兩個樹是否完全相等。