zoukankan      html  css  js  c++  java
  • swust oj 987

    输出用先序遍历创建的二叉树是否为完全二叉树的判定结果

    1000(ms)
    10000(kb)
    2553 / 5268
    利用先序递归遍历算法创建二叉树并判断该二叉树是否为完全二叉树。完全二叉树只能是同深度的满二叉树缺少最后一层倒数连续个叶子结点。先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树的二叉链表存储结构。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#"时表示该结点不需要创建,否则创建该结点。最后判断创建完成的二叉树度是否为完全二叉树。需要注意输入数据序列中的"#"字符和非"#"字符的序列及个数关系,这会最终决定创建的二叉树的形态。

    输入

    输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)。

    输出

    对应的二叉树是否为完全二叉树的判断结果。若是输出"Y",否则输出"N"。

    样例输入

    A##
    ABC####
    AB##C##
    ABCD###EF##G###
    A##B##
    ABC##D##EG###
    

    样例输出

    Y
    N
    Y
    N
    Y
    Y 
      1 #include<iostream>
      2 #include<algorithm>
      3 #include<cstring>
      4 #include<cstdlib>
      5 #include<cstdio>
      6 typedef char Datetype;
      7 using namespace std;
      8 Datetype value;
      9 int x;
     10 
     11 typedef struct link{
     12     Datetype date;
     13     struct link *lchild;
     14     struct link *rchild;
     15 }tree;
     16 
     17 typedef struct queue{
     18     tree *data;
     19     struct queue *next;
     20 }que;
     21 
     22 typedef struct {
     23     que *front;
     24     que *rear;
     25 }lin;
     26 
     27 void Initqueue(lin *&L)
     28 {
     29     L=(lin *)malloc(sizeof(lin));
     30     L->front=L->rear=NULL;
     31 }
     32 
     33 void destroyed(lin *&L)
     34 {
     35     que *p=NULL,*r=NULL;
     36     p=L->front;
     37     while(p!=NULL)
     38     {
     39         r=p;
     40         p=p->next;
     41         free(r);
     42     }
     43     free(L);
     44 }
     45 
     46 bool pop(lin *&L, tree *&e)
     47 {
     48     que *p;
     49     if(L->rear==NULL)
     50         return false;
     51     p=L->front;
     52     if(L->rear==L->front)
     53         L->front=L->rear=NULL;
     54     else
     55         L->front=p->next;
     56     e=p->data;
     57     free(p);
     58     return true;
     59 }
     60 
     61 int empty(lin *&L)
     62 {
     63     return (L->rear==NULL);
     64 }
     65 
     66 void push(lin *&L,tree *e)
     67 {
     68     que *p;
     69     p = (que *)malloc(sizeof(que));
     70     p->data=e;
     71     p->next=NULL;
     72     if(L->rear==NULL)
     73     {
     74         L->front=p;
     75         L->rear=p;
     76     }
     77     else
     78     {
     79         L->rear->next=p;
     80         L->rear=p;
     81     }
     82 }
     83 
     84 void creattree(tree *&L) //先序建立二叉树
     85 {
     86     char c;
     87     cin>>c;
     88     if(c=='#')
     89         L=NULL;
     90     else
     91     {
     92         L = (tree *)malloc(sizeof(tree)) ;
     93         L->date=c;
     94         creattree(L->lchild);
     95         creattree(L->rchild);
     96     }
     97 }
     98 
     99 void find(tree *L) //找树的棵树
    100 {
    101     if(L!=NULL)
    102     {
    103         x++;
    104         find(L->rchild);
    105     }
    106 }
    107 
    108 void destroytree(tree *&L) //销毁树
    109 {
    110     if(L!=NULL)
    111     {
    112         destroytree(L->lchild);
    113         destroytree(L->rchild);
    114         free(L);
    115     }
    116 }
    117 
    118 int deep(tree *L) //深度
    119 {
    120     int ldep,rdep,max;
    121     if(L!=NULL)
    122     {
    123         ldep=deep(L->lchild);
    124         rdep=deep(L->rchild);
    125         max=ldep>rdep?ldep+1:rdep+1;
    126         return max;
    127     }
    128     else
    129         return 0;
    130 }
    131 
    132 void finddegree(tree *&L, int n) //找最大度数
    133 {
    134     if(L!=NULL)
    135     {
    136         if(x<n)
    137             x=n;
    138         finddegree(L->lchild,n);
    139         finddegree(L->rchild,n+1);
    140     }
    141 
    142 }
    143 
    144 void run(tree *L)  //层次遍历
    145 {
    146     tree *p=L;
    147     lin *qu;
    148     Initqueue(qu);
    149     if(L!=NULL)
    150         push(qu,p);
    151     while(!empty(qu))
    152     {
    153         pop(qu,p);
    154         cout<<p->date;
    155         if(p->lchild!=NULL)
    156             push(qu,p->lchild);
    157         if(p->rchild!=NULL)
    158             push(qu,p->rchild);
    159     }
    160     destroyed(qu);
    161 }
    162 
    163 void displayhou(tree *&L) //后序输出
    164 {
    165     if(L!=NULL)
    166     {
    167         displayhou(L->lchild);
    168         displayhou(L->rchild);
    169         cout<<L->date;
    170     }
    171 }
    172 
    173 void displaypre(tree *&L) //先序输出
    174 {
    175     if(L!=NULL)
    176     {
    177         cout<<L->date;
    178         displaypre(L->lchild);
    179         displaypre(L->rchild);
    180     }
    181 }
    182 
    183 void creatinpre(tree *&L ,char *in,char *pre,int x)//根据中先序确定后序
    184 {
    185     int k=0;
    186     char *p;
    187     if(x<=0)
    188     {
    189         L=NULL;
    190         return ;
    191     }
    192     L=(tree *)malloc(sizeof(tree));
    193     L->date = *pre;
    194     for(p=in ; p<in+x; p++)
    195     {
    196         if(*p==*pre)
    197             break;
    198     }
    199     k=p-in;
    200     creatinpre(L->lchild,in,pre+1,k);
    201     creatinpre(L->rchild,p+1,pre+k+1,x-k-1);
    202 }
    203 
    204 void creatinhou(tree *&L ,char *in,char *pre,int x)  //根据中后序确定先序
    205 {
    206     int k=0;
    207     char *p;
    208     if(x<=0)
    209     {
    210         L=NULL;
    211         return ;
    212     }
    213     L=(tree *)malloc(sizeof(tree));
    214     L->date = *pre;
    215     for(p=in ; p>in-x; p--)
    216     {
    217         if(*p==*pre)
    218             break;
    219     }
    220     k=in-p;
    221     creatinhou(L->rchild,in,pre-1,k);
    222     creatinhou(L->lchild,p-1,pre-k-1,x-k-1);
    223 }
    224 
    225 void findson(tree *&L)  //找指定节点的儿子
    226 {
    227     if(L!=NULL)
    228     {
    229         if(L->date==x)
    230         {
    231             if(L->lchild==NULL)
    232                 cout<<"L:#";
    233             else
    234                 cout<<"L:"<<L->lchild->date;
    235             if(L->rchild==NULL)
    236                 cout<<",R:#";
    237             else
    238                 cout<<",R:"<<L->rchild->date;
    239             return ;
    240         }
    241         findson(L->lchild);
    242         findson(L->rchild);
    243     }
    244 }
    245 
    246 void finddad(tree *&L)  //找指定节点的父亲节点
    247 {
    248     if(L!=NULL)
    249     {
    250         if(L->lchild!=NULL&&L->lchild->date==x||L->rchild!=NULL&&L->rchild->date==x)
    251         {
    252             cout<<L->date;
    253             return ;
    254         }
    255 
    256         finddad(L->lchild);
    257         finddad(L->rchild);
    258     }
    259 }
    260 
    261 int find_the_one_degree(tree *&L)  //找寻某指定节点的度
    262 {
    263     if(L!=NULL)
    264     {
    265         if(L->date==value)
    266         {
    267             if(L->lchild!=NULL&&L->rchild==NULL||L->lchild==NULL&&L->rchild!=NULL)
    268                 return 1;
    269             else if(L->lchild==NULL&&L->rchild==NULL)
    270                 return 0;
    271             else
    272                 return 2;
    273         }
    274         find_the_one_degree(L->lchild);
    275         find_the_one_degree(L->rchild);
    276     }
    277 }
    278 
    279 void exchange(tree *&L)  //交换左右儿子的值
    280 {
    281     if(L!=NULL)
    282     {
    283         tree *p;
    284         p=L->lchild;
    285         L->lchild=L->rchild;
    286         L->rchild=p;
    287         exchange(L->lchild);
    288         exchange(L->rchild);
    289     }
    290 }
    291 
    292 void displayin(tree *&L)  //中序输出
    293 {
    294     if(L!=NULL)
    295     {
    296         displayin(L->lchild);
    297         cout<<L->date;
    298         displayin(L->rchild);
    299     }
    300 }
    301 
    302 bool banlancetree(tree *&L)   //平衡树
    303 {
    304     if(L==NULL)
    305         return true;
    306     int left=deep(L->lchild);
    307     int right=deep(L->rchild);
    308     int gas=left-right;
    309     if(gas>1||gas<-1)
    310         return false;
    311     return banlancetree(L->lchild)&&banlancetree(L->rchild);
    312 }
    313 
    314 bool perfecttree(tree *&L,int deepth)  //完全二叉树的判定
    315 {
    316     if(L==NULL)
    317         return true;
    318     if(L->rchild!=NULL&&L->lchild==NULL)
    319         return false;
    320     if(x-deepth>1&&L->rchild==NULL)
    321         return false;
    322     return perfecttree(L->lchild,deepth+1)&&perfecttree(L->rchild,deepth+1);
    323 }
    324 
    325 int main()
    326 {
    327     tree *L = NULL;
    328     creattree(L);
    329     x=deep(L);
    330     if(perfecttree(L,1))
    331         cout<<"Y";
    332     else
    333         cout<<"N";
    334     destroytree(L);
    335     return 0;
    336 }
  • 相关阅读:
    基于vue2.0 +vuex+ element-ui后台管理系统:包括本地开发调试详细步骤
    require.js实现js模块化编程(二):RequireJS Optimizer
    require.js实现js模块化编程(一)
    树型权限管理插件:jQuery Tree Multiselect详细使用指南
    表格组件神器:bootstrap table详细使用指南
    后台管理系统中的重点知识大全
    Ajax最详细的参数解析和场景应用
    npm常用命令小结
    详解javascript,ES5标准中新增的几种高效Object操作方法
    git入门学习(二):新建分支/上传代码/删除分支
  • 原文地址:https://www.cnblogs.com/Iwpml-595/p/10712989.html
Copyright © 2011-2022 走看看