判断一棵树是否是另一棵树的子树

时间:2021-04-25 19:43:58

     这个题目是《剑指offer》中的一道题,今天我们来一起看一下这道题的解题思路及其代码!

    解题思路分两步。第一步:先找到与根节点值相同的节点,用递归遍历可以很容易地实现。第二步:判断从根节点开始的其他节点结构是否一致,也是递归实现。由于思路简单,那么我们接下来直接看代码吧。

struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool ret = false;
if(pRoot1!=NULL && pRoot2!=NULL){
if(pRoot1->val==pRoot2->val)
ret = DoesTree1HaveTree2(pRoot1, pRoot2);
if(!ret)
ret = HasSubtree(pRoot1->left, pRoot2);
if(!ret)
ret = HasSubtree(pRoot1->right, pRoot2);
}
return ret;
}

bool DoesTree1HaveTree2(TreeNode* pRoot1, TreeNode* pRoot2){
if(pRoot2==NULL)
return true;
if(pRoot1==NULL)
return false;
if(pRoot1->val != pRoot2->val)
return false;
return DoesTree1HaveTree2(pRoot1->left, pRoot2->left) && DoesTree1HaveTree2(pRoot1->right, pRoot2->right);

}
};


注意:关于二叉树的问题,必须注意的是,因为二叉树相关的代码有大量的指针操作,每一次使用时我们都必须对它进行判空和相应的处理,否则在某些测试用例下程序会崩溃,造成不可避免的错误。