判断A树是否包含B树结构

题目:输入两棵二叉树A和B,判断B是不是A的子结构

分析:根据数的遍历方法,首先想到的是采用递归的方式要更简单些,树A从根节点进行遍历,首先判断与B的根节点值是否相等,如果相等则进行递归遍历验证,否则验证树A的其他节点,直到所有的结点遍历完。

注意的就是指针是否为NULL

复制代码
//判断B是不是A的子树
struct BinaryTree{
    int  m_value;
    BinaryTree * LeftTree;
    BinaryTree * RightTree;
};
bool DoesHasSubTree(BinaryTree *pRoot1,BinaryTree *pRoot2);
bool HasSubTree(BinaryTree * pRoot1,BinaryTree * pRoot2)
{
    
    //当结点不相同的时候怎么去遍历其他的结点呢?
    //这里采用的方法是设置一个result,当result=false时候我们并不是直接结束程序,而是继续去遍历其他点,直到所有的点都遍历完
    //这里hasSubTree函数主要是为了遍历结点,而真正进行匹配是由函数DoesHasSubTree来实现
    bool result=false;

    if(pRoot1!=NULL&&pRoot2!=NULL)  //除此之外的所有情况我们都认为是不包含子树的,条件是不能丢的
    {
        if(pRoot1->m_value==pRoot2->m_value)          //一旦查到有结点相同,就进行递归遍历进行匹配见下面函数
            result=DoesHasSubTree(pRoot1,pRoot2)      //这个函数式递归函数,所以在里面还需要进行判断pRoot1->m_value==pRoot2->m_value是否相等
            if(!result)                                  //遍历了根节点接下来从左子树开始遍历,(递归的作用是左子树变成根节点进行匹配。)有点类似深度优先搜索。
                result=HasSubTree(pRoot1->LeftTree,pRoot2->LeftTree); 
            if(!result)                                  //当所有左子树没有匹配到我们就开始匹配右子树,直到所有的结点遍历完。
                result=HasSubTree(pRoot1->RightTree,pRoot2->RightTree);        
    }    
    return result;//返回最终的结果    
}
bool DoesHasSubTree(BinaryTree *pRoot1,BinaryTree *pRoot2)
{
    if(pRoot2==NULL)        //当子树遍历完的标志,可以遍历完说明过程中没有碰到false条件,也就是都是匹配的
        return true;
    if(pRoot1==NULL)
        return false;

    if(pRoot1->m_value!=pRoot2->m_value)
        return false;
    return DoesHasSubTree(pRoot1->LeftTree,pRoot2->LeftTree)&& DoesHasSubTree(pRoot1->RightTree,pRoot2->RightTree);  //用&&对左右两边都进行判断    
}   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值