572. Subtree of Another Tree
Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and node values with a subtree of s. A subtree of s is a tree consists of a node in s and all of this node’s descendants. The tree s could also be considered as a subtree of itself.Example 1:
Given tree s:3
/ \
4 5
/ \
1 2
Given tree t:
4
/ \
1 2
Return true, because t has the same structure and node values with a subtree of s.
Example 2:
Given tree s:3
/ \
4 5
/ \
1 2
/
0
Given tree t:
4
/ \
1 2
Return 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 isSubtree(TreeNode* s, TreeNode* t) {
bool result = false;
// 保证不为空的情况下才传给子函数处理,t题目其实已经说了不为空了
if(s != NULL && t != NULL){
// 如果值相同,则调用is函数判断是不是相同的子树
if(s->val == t->val)
result = is(s, t);
// 如果根结点不是,则分别递归判断左右子结点
if(result == false)
result = isSubtree(s->left, t);
if(result == false)
result = isSubtree(s->right, t);
}
return result;
}
// 此函数判断root1和root2 是不是相同的子树
bool is(TreeNode* root1, TreeNode* root2){
// 题目强调的是子树,不是子结构,所以只有遍历到都为空时才返回true
if(root1 == NULL && root2 == NULL)
return true;
if(root1 == NULL || root2 == NULL)
return false;
if(root1->val != root2->val)
return false;
return is(root1->left, root2->left) && is(root1->right, root2->right);
}
};