二叉树 判断一颗二叉树是否是另一颗树的子结构

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

 

思路:

1  判断A B根节点是否相等,若相等,判断A B左右子树是否是 父子结构关系  若都成立  返回true

2  若不相等,那么递归到A的左右子树  判断B是不是A的子树的子结构

 

树结构:                                 

truct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};

核心函数   hastree  

注意该函数仅仅判断 root1 root2根节点匹配情况

bool hastree(TreeNode* root1,TreeNode* root2)
    {
        if(root2==NULL)  //root2已经遍历完,root1可能还有剩余,那么包含该子结构
            return true;
        if(root1==NULL)  //root1已经遍历完,root2可能还有剩余,那么不包含该子结构
            return false;
        if(root1->val!=root2->val) //根节点的值都不相同 肯定不包含
            return false;
        else
            return (hastree(root1->left,root2->left))&&(hastree(root1->right,root2- 
           >right));  //一般情况下需要向下递归
    }

主函数  HasSubtree  判断pRoot1是否包含pRoo2子结构

采用递归思路

bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
       
        if(pRoot1!=NULL && pRoot2!=NULL) //仅在2个节点都不为空情况下分析
        {
            if(hastree(pRoot1,pRoot2))  //先判断根节点是否 可以包含子树
                return true;
            if(HasSubtree(pRoot1->left,pRoot2))  //否则递归到判断左右子树是否包含子结构
                return true;
            if(HasSubtree(pRoot1->right,pRoot2))
                return true;
        }
        return false;
         
 
    }

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值