• 输入两棵二叉树A,B,判断B是不是A的子结构(c++实现)


    #include <iostream>
    #include <cstdio>
    #include <stdio.h>
    #include <string>
    #include <queue>
    #include <stack>
    using namespace std;
    
    class Node{
    public :
        char data;
        struct Node *lchild,*rchild;
    };
    
    class BiTree{
    public:
        Node * root;//头结点
        int height=0;//树的高度
        BiTree() {root=NULL;}
        //层序创建二叉树
        void create_level(string &s)
        {
           int p=0;
           root=new Node();
    
           Node *t,*i,*j;
           queue<Node*> qTree;//定义一个队列,存储节点
           while(true)
           {
               if(p==s.size())break;
               if(p==0)//当头结点未创建
               {
                   t=new Node();
                   t->data=s[p];
                   qTree.push(t);//头结点进队
                   root=t;
                   p++;
               }
               else
               {
                   t=qTree.front();//该节点出队
                   if(p==s.size())break;//树的构建完毕
                   if(s[p]=='#')//不存在左节点
                   {
                      t->lchild=NULL;
                      p++;
                   }
                   else//存在左节点
                   {
                       i=new Node();
                       i->data=s[p];
                       t->lchild=i;//左节点进队
                       qTree.push(i);
                       p++;
                   }
    
                   if(p==s.size())break;
                   if(s[p]=='#')//不存在右节点
                   {
                      t->rchild=NULL;
                      p++;
                   }
                   else//存在右节点
                   {
                       j=new Node();
                       j->data=s[p];
                       t->rchild=j;
                       qTree.push(j);
                       p++;
                   }
    
                   qTree.pop();//节点左右节点已创建,该节点出队
               }
           }
    
        }
    };
    
    class Solution
    {
        bool isSubtree(Node* pRootA,Node* pRootB)
        {
            /*以下if语句不能调换,如果调换返回结果都为false
             *比如: A树:123 B树:123
             *     在遍历两树的节点2时,递归进入下一次,两树的节点2的左节点都为NULL,进入递归
             *     此时pRootA=NULL、pRootB=NULL,如果pRootA==NULL放在前面,返回false
            */
            if(pRootB==NULL) return true;
            if(pRootA==NULL) return false;
            if(pRootA->data==pRootB->data)
            {
                //如果树A树B节点值相等,继续递归遍历他们的左右节点是否相等
                return isSubtree(pRootA->lchild,pRootB->lchild)&& isSubtree(pRootA->rchild,pRootB->rchild);
            }
            else return false;
        }
    public:
        bool HasSubtree(Node* pRootA,Node* pRootB)
        {
            if(pRootA==NULL||pRootB==NULL)return false;
            //从树A的该节点开始遍历看是否与B节点的根值是否相同 || 比较树A的该节点的左节点与树B的根节点 || 比较树A的该节点的右节点与树B的根节点
            return isSubtree(pRootA,pRootB)||HasSubtree(pRootA->lchild,pRootB)||HasSubtree(pRootA->rchild,pRootB);
        }
    };
    
    int main()
    {
        BiTree a,b;
        string s1,s2;
        s1="88792####47";
        a.create_level(s1);
        s2="892";
        b.create_level(s2);
        Solution s;
        bool bo=s.HasSubtree(a.root,b.root);
        cout<<bo<<endl;
    
        return 0;
    }
  • 相关阅读:
    分布式数据库中间件Mycat百亿级数据存储(转)
    大文本字符串滤重的解决方案(转)
    java处理大文本2G以上
    Mysql binlog详解
    varnish squid nginx比较
    java运行时内存分类
    redis rdb aof比较
    LeetCode 94 ——二叉树的中序遍历
    线性代数之——向量空间
    线性代数之——A 的 LU 分解
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/9221169.html
Copyright © 2020-2023  润新知