zoukankan      html  css  js  c++  java
  • 输入两棵二叉树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;
    }
  • 相关阅读:
    BASH让标准输出和错误输出颜色不同
    为Linux的文件管理器创建“在此打开终端”菜单
    在Linux终端中快速生成、解码二维码
    让BASH用得更舒服:提示符颜色、时间、显示返回值、终端标题显示当前目录与正在执行的命令
    Linux关联文件扩展名和打开程序
    Linux发行版教你如何选 给入门者的选择通法
    B/S架构与C/S架构的比较
    一个PB12.5安装的问题
    介绍JavaEE平台
    类与对象小结
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/9221169.html
Copyright © 2011-2022 走看看