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

树的子结构

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:两个子树左边比较 && 两个子树右边比较。

全部评论

相关推荐

Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务