版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhao5502169/article/details/88977013
连接
很有意思的一个题目。竟然没有一次性通过。发现自己的代码还是有点问题。。
思路很容易想到:遍历第一个二叉树,找到与第二个二叉树的根节点相同的点,再从这个点开始判断。所以需要写一个遍历函数进行对比。
有个小坑点,在代码注释处。
代码如下:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool Tree1HaveTree2(TreeNode *L,TreeNode *R){
if(R == NULL) return true;
if(R != NULL && L == NULL) return false;
if(L->val == R->val)
return Tree1HaveTree2(L->left,R->left)&&Tree1HaveTree2(L->right,R->right);
else
return false;
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
//这里原本感觉是true,不过没过,改成false反而过了。。
if(pRoot2 == NULL)
return false;
if(pRoot1 == NULL)
return false;
//这里注意不要把Tree1HaveTree2 return出去。这样就不进行后面的判断了。
if(pRoot1->val == pRoot2->val && Tree1HaveTree2(pRoot1,pRoot2))
return true;
else{
return (HasSubtree(pRoot1->left,pRoot2)||HasSubtree(pRoot1->right,pRoot2));
}
}
};