572. Subtree of Another Tree Medium

来源:互联网 发布:英雄联盟for mac美服 编辑:程序博客网 时间:2024/06/06 17:26

第一次做二叉树的题目。首先要知道,二叉树的题目,大部分都可以用递归来解决。


对于这道题,我们先考虑一个子问题,怎么样判断两棵树是不是相同的树。我们可以先比较两个树根,这里分几种情况:

1.两个树根都是空,则树相同。

2.两个树根只有一个为空,则肯定不相同。

3.两个树根都不为空,这里分两种情况:树根处的值相等,那我们需要继续比较他们的儿子是否相等;如果值不相等,则树不相等。

如果要继续比较的话,我们需要他们的左儿子和右儿子都相等,这其实是一个"&&"的关系。递归版代码如下:

bool isSame(TreeNode* s, TreeNode* t)    {     if(s == NULL && t == NULL)return true;     if(s == NULL || t == NULL)return false;     if(s->val != t->val)return false;     return isSame(s->left, t->left) && isSame(s->right, t->right);    }


解决了这个子问题,我们剩下要做的,就是遍历s这个树,找跟t的树根的值一样的顶点,然后判断它们是不是一样就可以。遍历一个顶点时,如果是t的树根的值一样,判断一下,如果一样,返回true就可以;如果不是,因为我们还要继续找,不能返回false。如果这个顶点跟t的根不一样,怎么办?其实这里是“||”的关系,这个顶点不一样没关系,它的左子树或右子树有一个一样就可以了。代码如下:

bool isSubtree(TreeNode* s, TreeNode* t) {
     if(s == NULL || t == NULL)return false;
     if(s->val == t->val)
     if(isSame(s, t))return true;
     return isSubtree(s->left, t) || isSubtree(s->right, t);
    
    }

0 0