1.题目
给你两棵二叉树 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]
-104 <= root.val <= 104
-104 <= subRoot.val <= 104
2.解析
首先我们可以知道root为空时肯定不存在即返回false;
第二点我们可以套用LeetCode——100——相同的树的思路bool isSameTree判断是否相同;
我们可以考虑递归找root->val==subRoot->val时进行比较此时root和subRoot是否相同,
我们不能直接写
if(root->val==subRoot->val) return (isSameTree(root,subRoot));
但此时我们需要考虑以下这种情况
因此我们要改为限制条件 ,实现不断对比,查找是否存在 root 中是否包含和 subRoot 具有相同结构和节点值的子树;
if(root->val==subRoot->val) { if(isSameTree(root,subRoot)) { return true; } }
root左右子树递归查看
3.代码实现
bool isSameTree(struct TreeNode* p, struct TreeNode* q) { if(p==NULL&&q==NULL) { return true; } 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); } bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) { if(root==NULL) { return false; } if(root->val==subRoot->val) { if(isSameTree(root,subRoot)) { return true; } } return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot); }
将代码
if(root->val==subRoot->val) { if(isSameTree(root,subRoot)) { return true; } } return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot); }
可升华为
return isSameTree(root,subRoot)||isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
最终代码
bool isSameTree(struct TreeNode* p, struct TreeNode* q) { if(p==NULL&&q==NULL) { return true; } 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); } bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) { if(root==NULL) { return false; } return isSameTree(root,subRoot)||isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot); }