目录
1.题目
https://leetcode.cn/problems/subtree-of-another-tree/description/
给你两棵二叉树
root
和subRoot
。检验root
中是否包含和subRoot
具有相同结构和节点值的子树。如果存在,返回true
;否则,返回false
。二叉树
tree
的一棵子树包括tree
的某个节点和这个节点的所有后代节点。tree
也可以看做它自身的一棵子树。示例 1:
输入:root = [3,4,5,1,2], subRoot = [4,1,2] 输出:true示例 2:
输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2] 输出:false提示:
root
树上的节点数量范围是[1, 2000]
subRoot
树上的节点数量范围是[1, 1000]
-10^4 <= root.val <= 10^4
-10^4 <= subRoot.val <= 10^4
代码模板
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{
}
2.分析
题目的意思是在整棵二叉树中寻找特定的子树(局部相等)
检查是否包含subroot,即寻找相同的子树,因此可以直接调用L15.【LeetCode笔记】相同的树文章的代码,如下
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
if (p==NULL && q==NULL)
return true;
//若能执行到此,排除了两个都为NULL的情况,剩下的情况:1.其中一个为NULL;2.两个都不为NULL
if ((p==NULL)+(q==NULL)==1)
return false;
//只剩下最后一种情况:p和q都不为NULL
if (p->val!=q->val)
return false;
//执行到此处,说明p->val和q->val相等
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
现在的问题转化为如何设计isSubtree函数使其能合理调用isSameTree函数
由于subRoot肯定不为空树,因此上来先判断root==NULL
if(root==NULL)
return false;
除去了这种情况,剩下root!=NULL,把每个节点视作根去寻找子树,判断子树是否相等
可以判断isSameTree(root,sunRoot)的返回值,再进一步操作
if (isSameTree(root,subRoot))
return true;
如果上方函数的返回值为false,情况有两种:1.完全找不到符合subRoot的子树 2.不是要找的子树,需要进一步查找(root->left和root->right)
注意:只要左右子树有一个符合要求就可以,因此用或(||)连接
return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
递归展开图(只画isSameTree),以下面这个二叉树为例说明
注:CSDN会压缩图片画质,无损bmp图片链接(大小 9.28M)见百度网盘 请输入提取码
3.代码
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
if (p==NULL && q==NULL)
return true;
//若能执行到此,排除了两个都为NULL的情况,剩下的情况:1.其中一个为NULL;2.两个都不为NULL
if ((p==NULL)+(q==NULL)==1)
return false;
//只剩下最后一种情况:p和q都不为NULL
if (p->val!=q->val)
return false;
//执行到此处,说明p->val和q->val相等
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{
if (root==NULL)
return false;
if (isSameTree(root,subRoot))
return true;
return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}