Description
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.
Solution 1(C++)
static int x =[](){std::ios::sync_with_stdio(false); cin.tie(NULL); return 0;}();
class Solution {
public:
bool isSameTree(TreeNode* s, TreeNode* t){
if(!s && !t) return true;
else if(!s || !t) return false;
if(s->val != t->val) return false;
else return isSameTree(s->left, t->left) && isSameTree(s->right, t->right);
}
bool isSubtree(TreeNode* s, TreeNode* t) {
if(!s || !t) return false;
if(isSameTree(s, t)) return true;
else return isSubtree(s->right, t) || isSubtree(s->left, t);
}
};
Solution 2(C++)
class Solution {
vector<TreeNode*> nodes;
public:
bool checkSubtree(TreeNode* s,TreeNode* t)
{
if(!s &&!t)
return true;
if(!s ||!t||s->val!=t->val)
return false;
return checkSubtree(s->left,t->left)&&checkSubtree(s->right,t->right);
}
int getDepth(TreeNode* r,int d)
{
if(!r)
return -1;
int depth=max(getDepth(r->left,d),getDepth(r->right,d))+1;
if(depth==d)
nodes.push_back(r);
return depth;
}
bool isSubtree(TreeNode* s, TreeNode* t) {
if(!s && !t)
return true;
if(!s || !t)
return false;
getDepth(s,getDepth(t,-1));
for(TreeNode* n:nodes )
{
if(checkSubtree(n,t))
return true;
}
return false;
}
};
算法分析
解法二比我自己写的解法一更高效的原因就是,它直接在s中找与t高度相同的树,然后进行比较。虽然用到了额外的vector来储存这些高度相同的根节点,但是也挺好的。
程序分析
略。