• 判断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); 
                if(!result)                                  //当所有左子树没有匹配到我们就开始匹配右子树,直到所有的结点遍历完。
                    result=HasSubTree(pRoot1->RightTree,pRoot2);        
        }  
        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);  //用&&对左右两边都进行判断    
    }   
  • 相关阅读:
    Restful API设计规范
    git merge 和 git merge --no-ff
    [Machine Learning & Algorithm] 朴素贝叶斯算法(Naive Bayes)
    TF-IDF与余弦相似性的应用(三):自动摘要
    TF-IDF与余弦相似性的应用(二):找出相似文章
    TF-IDF与余弦相似性的应用(一):自动提取关键词
    LeetCode 442. Find All Duplicates in an Array
    LeetCode 29. Divide Two Integers
    LeetCode 402. Remove K Digits
    LeetCode 406. Queue Reconstruction by Height
  • 原文地址:https://www.cnblogs.com/menghuizuotian/p/3778600.html
Copyright © 2020-2023  润新知