LeetCode 572. 另一个树的子树
原题链接
简单
作者:
贺谦
,
2020-05-07 23:02:29
,
所有人可见
,
阅读 858
区别
- 这道题和剑指offer的一道题很像很像,区别在于这道题要求的是 子树,剑指Offer要求的是 子结构。子树要求匹配后节点都得是 叶子节点,子结构则不需要。我一开始用的子结构的代码下面这个样例就挂掉了。
3
/ \
4 5
/ \
1 2
/
0
解题思路
- 虽然题目说了两个二叉树是非空的,但是会不断递归到s和t的左右子树,其中t在
isSubtree
函数中一直是t不会变,所以t一定是非空的。但是如果s
递归到空还没有匹配,那么说明两个二叉树s和t不匹配。
- 如果s和t的根结点都不为空,就可以进行判断了,如果不匹配,就看看s的左子树或者右子树是否跟t匹配。
- 最后必须当A和B都为叶子节点的时候,才说明匹配。
- 如果A空B不空,B空A不空,均不空但是val不等,均属于不匹配的情况
- 如果在isPart中二者匹配,就递归同时看二者的左右子树是否匹配。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isPart(TreeNode *A, TreeNode *B)
{
if(!A && !B) return true;
if(!A && B || A && !B || A->val != B->val) return false;
return isPart(A->left, B->left) && isPart(A->right, B->right);
}
bool isSubtree(TreeNode* s, TreeNode* t) {
if(!s) return false;
if(isPart(s, t)) return true;
return isSubtree(s->left, t) || isSubtree(s->right, t);
}
};
有个问题想问下大家,我注释掉
dfs()
函数中的if(!s) return false
后,报的执行出错RE,但是它说我下面这个样例没过,我手动调试了下,这个样例不会碰到s为0的情况。这是为什么吖?
因为isSubtree函数是遍历每一个节点,然后用ispart判断两棵树是否相同。
当遍历到叶子节点时,就会后出现空指针。