目录
一、相同的树
二、另一个树的子树
一、相同的树
题述:
给定二叉树,检验他们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为他们是相同的。
示例1:
题中已给:
struct TreeNode
{
int val;
struct TreeNode* left;
struct TreeNode* right;
};
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
思路:
1、判断两棵子树时候都为空,是否一个为空另一个不为空 2、结构相同的情况下,对应比较每个节点对应的值是否相同。3、只要存在一处结构不同或一处值不同就返回false。
代码如下:
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{//总体类似于先序遍历
//判断结构是相同
if (p == NULL && q == NULL)
return true;
if (p == NULL && q != NULL)
return false;
if (p != NULL && q == NULL)
return false;
//判断值左右子树是否相同
if (p->val != q->val)
return false;
return isSameTree(p->left, q->left)
&& isSameTree(p->right, q->right);
}
二、另一个树的子树
题述:
给定两个非空二叉树s和t,检验s中是否包含和t具有相同结构和节点值的子树,s的一个子树包含s的一个节点和这个节点的所有子孙,s也可以看做他自身的一颗子树。
示例1:
给定的树s:
给定的树t:
返回true,因为t与s的一个子树拥有相同的结构和节点值。
示例2:
给定的树s:
给定的树t:
返回false
题中已给:
struct TreeNode
{
int val;
struct TreeNode* left;
struct TreeNode* right;
};
bool isSubTree(struct TreeNode* s, struct TreeNode* t)
思路:
t与s中所有子树相比较,即找到以所有节点为根的树相比,直到找到相同的一部分,若所有的都找不到,则返回false。
代码如下:
bool isSubTree(struct TreeNode* s, struct TreeNode* t)
{
if (s == NULL)
return false;//如果s都为NULL了,t肯定就不是s的子树
if (isSameTree(s, t))
return true;
//再看以s->left和s->right为根的子树的其中之一是否有子树t
return isSubTree(s->left, t) || isSubTree(s->right, t);
}