二叉树——判断是否是子树

树的子结构

http://www.nowcoder.com/questionTerminal/6e196c44c7004d15b1610b9afca8bd88

1.在大树中找到和小树根节点相同的节点。
2.然后以此节点为根节点,在大树上往下搜索对比小书左右节点是否相同,不同则返回false
3.如果2步中最后返回false 回到第一步,从大树的左子树找和小树根节点相同的节点。
4.如果3步中最后返回false 回到第一步,从大树的右子树找和小树根节点相同的节点。

/*
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)
    {
        if(!pRoot1||!pRoot2)return false;
        bool result = false;
        if(pRoot1->val==pRoot2->val)
            result = HasSubtreeHelper(pRoot1,pRoot2);
        if(result==false)
            result = HasSubtree(pRoot1->left,pRoot2);
        if(result==false)
            result = HasSubtree(pRoot1->right,pRoot2);
        return result;
    }
    bool HasSubtreeHelper(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if(pRoot2==nullptr)
            return true;
        if(pRoot1==nullptr)
            return false;
        if(pRoot1->val!=pRoot2->val)
            return false;
        return HasSubtreeHelper(pRoot1->left, pRoot2->left)&&HasSubtreeHelper(pRoot1->right, pRoot2->right);
    }


};

HasSubtree(a,b)函数:
如果ab两个子树有一个为空,false;
如果ab根节点数值相等,进入子函数
如果前面是false,重新进入本函数,采用HasSubtree(a->left,b);
如果前面是false,重新进入本函数,采用HasSubtree(a->right,b);
子函数HasSubtreeHelper(a,b):
如果b子树被遍历完全,返回true,也就是说所有b的节点都比较完了;
如果a子树空了,false;
如果两子树的值不等,返回false;
return:两个子树左边比较 && 两个子树右边比较。

全部评论

相关推荐

屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务