572. 另一棵树的子树 - 力扣(LeetCode)(点击前面链接即可查看题目)
一、题目
给你两棵二叉树
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
二、解题思路以及代码
遍历每个结点,判定是不是其子树,
判断两棵树是否相同可参考:相同的树 - 力扣(LeetCode)C语言-CSDN博客
思考:可以增加一个判断,遍历时如果剩余层数小于子树的层数则必然不可能再存在了,可以直接跳出。但是这样也相当于遍历了树,所以不需要增加此判断。
/**
* 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(NULL == p && NULL == q)
return true;
if(NULL == p || NULL == q)
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(NULL == root)
return false;
if(isSameTree(root,subRoot))
return true;
return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}