给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
示例 1:
给定的树 s:
3
/ \
4 5
/ \
1 2
给定的树 t:
4
/ \
1 2
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
思路分析:
判断一棵树是否为另一棵树的子树,首先要考虑的是,如果要比较的两棵树s和t都为空,则返回空,如果是子树t为空,则返回true,如果是非子树s为空,则返回false,如果两棵树s和t都不为空,就在二叉树s中遍历寻找t的根节点,如果找到了,从这个节点开始遍历二叉树s,如果所有s对应的子节点,都在t中出现,并且不存在的,t也不存在,则返回true。
具体代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSameTree(struct TreeNode* t1,struct TreeNode* t2)
{
if(t1==NULL&&t2== NULL)
{
return true;
}
if(t1==NULL||t2== NULL)
{
return false;
}
return t1->val==t2->val
&&isSameTree(t1->left,t2->left)
&&isSameTree(t1->right,t2->right);
}
bool isSubtree(struct TreeNode* s, struct TreeNode* t)
{
if(t==NULL)
{
return true;
}
if(s==NULL)
{
return false;
}
if(s->val==t->val && isSameTree(s, t))
{
return true;
}
return isSubtree(s->left,t)
|| isSubtree(s->right,t);
}