目录
1:题目分析及思路
2:代码实现和分析
1:代码
2:分析
1:题目分析及思路
给我们两棵二叉树,分别是 root
和 subRoot
。检验 root
中是否包含和 subRoot
具有相同结构和节点值的子树。如果存在,返回 true
;否则,返回 false
;
二叉树 tree
的一棵子树包括 tree
的某个节点和这个节点的所有后代节点。tree
也可以看做它自身的一棵子树。
分析:我们要判断subRoot这颗树是否在root这颗树中有一颗和他完全相同的树
,就如示例1:subRoot同root的左子树完全相同;示例2:subRoot就不同于root的左子树,因为root的左子树的叶子节点存在子节点,所以我们可以判断subRoot不是root的子树;
思路: 我们要如何判断subRoot是否是root的子树呢?
1):我们要判断subRoot的值是否和root的子树的值相等;
2):在判断值是否相等的同时还要判断root的子树的左右子树是否和subRoot左右子树相同;
2:代码实现和分析
1:代码
/**
* 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;
if(p->val != q->val)
return false;
return isSameTree(q->left,p->left)
&& isSameTree(q->right,p->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
if(root == NULL)
return false;
if(root->val == subRoot->val && isSameTree(root,subRoot))
return true;
return isSubtree(root->left,subRoot)
|| isSubtree(root->right,subRoot);
}
2:分析
这里的isSameTree函数判断了root的子树和subRoot是否是两课相同的二叉树,他们各自的左右子树是否一致,也就是判断他们在形状上以及节点个数是否相同;
1):isSubtree函数首先对树判断是否是空树,如果是空树,那么就直接返回false,说明subRoot不是root的另一颗子树;
2):接下来判断root的值是否等于subRoot的值,并且还需要调用一下isSameTree函数,如果判断结果成立说明subRoot是root的另一颗子树;
3):最后进行递归调用,判断好一层后继续向下一层进行判断;
以上就是二叉处OJ—另一颗树的子树的所有分析和理解了,创作不易,求求大家点个小赞赞,感谢各位大佬们的赏脸观看,随手点个赞,养成好习惯,如有问题,感谢反馈!