https://leetcode-cn.com/problems/subtree-of-another-tree/description/
给定两个非空二叉树 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。
思路;
首先比较s树和t树的根节点是否相等,调用isSameTree()判断它们是否是相等的树
然后递归判断左子树的根节点去比较,以此类推
实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//判断两个树是否相等
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
if(p == NULL && q == NULL)
return true;
if(p == NULL || q == NULL)
return false;
return p->val == q->val
&& isSameTree(p->left, q->left)
&& isSameTree(p->right, q->right);
}
bool isSubtree(struct TreeNode* s, struct TreeNode* t) {
//t == NULL 是所有树的子树
if(t == NULL)
return true;
//s == NULL 母树为空,子树一定为空,走第一个if条件
if(s == NULL)
return false;
//判断节点相等,并且是、相等的树
if(s->val == t->val && isSameTree(s, t))
return true;
//递归判断下一个结点是不是t的母树
return isSubtree(s->left, t)
|| isSubtree(s->right, t);
}