zoukankan      html  css  js  c++  java
  • 二叉树 数据结构

     实验四  二叉树子系统

    1.实验目的

    (1)掌握二叉树的特点及其存储方式。

    (2)掌握二叉树的创建和显示方法。

    (3)复习二叉树遍历的概念,掌握二叉树遍历的基本方法。

    2.实验内容

    (1)按屏幕提示用前序方法建立一棵二叉树。

    (2)编写各个函数:前序遍历、中序遍历、后序遍历、层次遍历、求二叉树的叶子结点数、求二叉树的总结点数、求二叉树的深度。

    (3)设计一个选择式菜单,以菜单方式选择下列操作。

    二叉树子系统

                    *******************************************

                    *   1------建二叉树                         *

                 *   2------凹入显示                         *

                    *   3------先序遍历                         *

                    *   4------中序遍历                         *

    *   5------后序遍历                         *

                    *   6------层次遍历                         *

                    *   7------求叶子数                         *

                    *   8------求结点数                         *

                    *   9------求树深度                         *

                    *   0------返    回                         *

                 *******************************************

    请选择菜单号(0--9):

    3.实验步骤

    (1)按下图建立二叉树。

    (2)输入并调试程序。

    (3)验证程序运行结果。

    附:程序清单如下:

      1 #include<stdio.h>
      2 #define TREEMAX 100
      3 typedef struct BT
      4 { char data;
      5   struct BT* lchild;
      6   struct BT*rchild;
      7 }BT;
      8 
      9 BT *CreateTree();
     10 void ShowTree(BT *T);
     11 void Preorder(BT *T);
     12 void Postorder(BT *T);
     13 void Levelorder(BT *T);
     14 void Inorder(BT *T);
     15 void Nodenum(BT *T);
     16 void Leafnum(BT *T);
     17 int TreeDepth(BT *T);
     18 int count=0;
     19 
     20 void main()
     21 {BT*T=NULL;
     22  char ch1,ch2,a;
     23  ch1='y';
     24  while(ch1=='y'||ch1=='Y')
     25     {printf("
    ");
     26     printf("
    		            二叉树子系统");
     27     printf("
    		*****************************************");
     28     printf("
    		*          1----建二叉树                *");
     29     printf("
    		*          2----凹入显示                *");
     30     printf("
    		*          3----先序遍历                *");
     31     printf("
    		*          4----中序遍历                *");
     32     printf("
    		*          5----后序遍历                *");
     33     printf("
    		*          6----层次遍历                *");
     34     printf("
    		*          7----求叶子数                *");
     35     printf("
    		*          8----求结点数                *");
     36     printf("
    		*          9----求树深度                *");
     37     printf("
    		*          0----返回                    *");
     38     printf("
    		*****************************************");
     39     printf("
    		   选择菜单号(0---9):");
     40 
     41     scanf("%c",&ch2);
     42     getchar();
     43     printf("
    ");
     44     switch(ch2)
     45         { case '1':
     46         printf("
    		请按先序序列输入二叉树的结点: 
    ");
     47         printf("
    		说明:输入结点('0'表示后继结点为空)后按回车。 
    ");
     48         printf("
    		请输入结点:");
     49         T=CreateTree();
     50         printf("
    		 二叉树成功建立!
    ");break;
     51         case '2':
     52             ShowTree(T);break;
     53         case '3':
     54             printf("
    		 该二叉树的先序遍历数列为:");
     55             Preorder(T);break;
     56         case '4':
     57             printf("
    		 该二叉树的中序遍历数列为:");
     58             Inorder(T);break;
     59         case '5':
     60             printf("
    		 该二叉树的后序遍历数列为:");
     61             Postorder(T);break;
     62         case '6':
     63             printf("
    		 该二叉树的层次遍历数列为:");
     64             Levelorder(T);break;
     65         case '7':
     66             count=0;Leafnum(T);
     67             printf("
    		 该二叉树总共有%d个叶子。
    ",count);break;
     68         case '8':
     69             count=0;Nodenum(T);
     70             printf("
    		 该二叉树总共有%d个结点。
    ",count);break;
     71         case '9':
     72             printf("
    		 该树的高度是:%d",TreeDepth(T));break;
     73         case '0':
     74             ch1='n';break;
     75         default:
     76             printf("
    		*** 请注意:输入有误!***");
     77         }
     78 
     79     if(ch2!='0')
     80     { printf("
    
    		 按ENTER键继续,按任意键返回主菜单!
    ");
     81      a=getchar();
     82      if(a!='xA')
     83      {getchar();ch1='n';}
     84     }
     85  }
     86 }
     87 
     88 
     89 
     90 BT *CreateTree()
     91 { BT *t;
     92   char x;
     93   scanf("%c",&x);
     94   getchar();
     95   if(x=='0')
     96     t=NULL;
     97   else
     98     {t=(BT*)malloc(sizeof(BT));
     99     t->data=x;
    100     printf("
    		请输入%c结点的左子结点:",t->data);
    101     t->lchild=CreateTree();
    102     printf("
    		请输入%c结点的右子结点:",t->data);
    103     t->rchild=CreateTree();
    104     }
    105   return t;
    106 }
    107 
    108 void Preorder(BT *T)
    109 { if(T)
    110     { printf("%3c",T->data);
    111       Preorder(T->lchild);
    112       Preorder(T->rchild);
    113     }
    114 }
    115 
    116 void Inorder(BT *T)
    117 { if(T)
    118     { 
    119       Preorder(T->lchild);
    120       printf("%3c",T->data);
    121       Preorder(T->rchild);
    122     }
    123 }
    124 
    125 void Postorder(BT *T)
    126 { if(T)
    127     { 
    128       Preorder(T->lchild);
    129       Preorder(T->rchild);
    130       printf("%3c",T->data);
    131     }
    132 }
    133 
    134 void Levelorder(BT *T)
    135 { int i,j;
    136   BT *q[100], *p;
    137   p=T;
    138   if(p!=NULL)
    139     {i=1;q[i]=p;j=2;}
    140      while(i!=j)
    141          {p=q[i];printf("%3c",p->data);
    142          if(p->lchild!=NULL)
    143         {q[j]=p->lchild;j++;}
    144         if(p->rchild!=NULL)
    145         {q[j]=p->rchild;j++;}
    146          i++;
    147     }
    148 }
    149 
    150 void Leafnum(BT *T)
    151 {if(T)
    152     {if(T->lchild==NULL&&T->rchild==NULL)
    153     count++;
    154     Leafnum(T->lchild);
    155     Leafnum(T->rchild);
    156     }
    157 }
    158 
    159 void Nodenum(BT *T)
    160 {if(T)
    161     {count++;
    162      Nodenum(T->lchild);
    163       Nodenum(T->rchild);
    164     }
    165 }
    166 int TreeDepth(BT *T)
    167 {int ldep,rdep;
    168  if(T==NULL)
    169  return 0;
    170 else
    171  {ldep=TreeDepth(T->lchild);
    172   rdep=TreeDepth(T->rchild);
    173   if(ldep>rdep)
    174     return ldep+1;
    175     else 
    176     return rdep+1;
    177 }
    178 }
    179 void ShowTree(BT *T)
    180 {BT *stack[TREEMAX],*p;
    181  int level[TREEMAX][2],top,n,i,width=4;
    182  if(T!=NULL)
    183     {printf("
    		 凹入表示法:
    		");
    184      top=1;
    185      stack[top]=T;
    186      level[top][0]=width;
    187      while(top>0)
    188         {p=stack[top];
    189         n=level[top][0];
    190         for(i=1;i<=n;i++)
    191         printf(" ");
    192         printf("%c",p->data);
    193         for(i=n+1;i<30;i+=2)
    194         printf("-");
    195         printf("
    		");
    196         top--;
    197         if(p->rchild!=NULL)
    198             {top++;
    199             stack[top]=p->rchild;
    200             level[top][0]=n+width;
    201             level[top][1]=2;
    202             }
    203         if(p->lchild!=NULL)
    204             {top++;
    205             stack[top]=p->lchild;
    206             level[top][0]=n+width;
    207             level[top][1]=1;
    208             }
    209         }
    210     }
    211 }

    运行过程及结果:

    1----建二叉树 

    2----凹入显示

    3----先序遍历

    4----中序遍历

    5----后序遍历

    6----层次遍历

    7----求叶子数

    8----求结点数

    9----求树深度

    0----返回

  • 相关阅读:
    JAVA自学笔记13
    非常不错的一款打字代码效果
    诡异的python文件
    Linux 虚拟机 docker 上 搭建 python 机器学习 平台
    git无法pull仓库: refusing to merge unrelated histories
    Python
    28 Jupyter Notebook tips, tricks, and shortcuts[Re-post]
    What is the best way to calculate a checksum for a file that is on my machine?
    Building MAPI Applications on 32-Bit and 64-Bit Platforms
    Linux 查看进程 关闭进程
  • 原文地址:https://www.cnblogs.com/daipianpian/p/4492860.html
Copyright © 2011-2022 走看看