码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构设计——二叉树实现

时间:2018-04-20 21:59:35      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:target   erro   define   lan   算法   cas   ini   font   title   

   本篇文章中所有数据结构都是后期整理的,如有问题欢迎指正,转载请注明出处http://www.cnblogs.com/a1982467767/p/8893567.html

 

二叉树操作设计和实现

实验目的

掌握二叉树的定义、性质及存储方式,各种遍历算法。

 

实验要求:

采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 typedef char DataType;
  4 typedef struct node{
  5     DataType data;
  6     struct node *lchild,*rchild;
  7 }Bnode, *BTree;
  8 int count;
  9 void CreateBTree(BTree *T);
 10 void PreorderN(BTree T);
 11 void MiddleN(BTree T);
 12 void LatterN(BTree T);
 13 
 14 #define StackSize 100 /*假定预分配的栈空间最多为10*/
 15 typedef BTree SDataType; /*栈的元素类型设为整型*/
 16 #define Error printf
 17 
 18 typedef struct{
 19     SDataType data[StackSize];
 20     int top;
 21 }SeqStack;
 22 
 23 SeqStack * InitStack(void) /*初始栈*/
 24 {
 25     SeqStack *S = (SeqStack *)malloc(sizeof(SeqStack) * StackSize); 
 26     S->top=-1;
 27 }
 28 
 29 int StackEmpty(SeqStack *S) /*判栈空*/
 30 {
 31     return S->top==-1;
 32 }
 33 
 34 int StackFull(SeqStack *S) /*判栈满*/
 35 {
 36     return S->top==StackSize-1;
 37 }
 38 
 39 void Push(SeqStack *S, SDataType x) /*进栈*/
 40 {
 41     if(StackFull(S))
 42         Error("STACK FULL!\n"); /*上溢退出*/
 43     else
 44         S->data[++S->top]=x; /*栈顶指针加1后将x进栈*/
 45 }
 46 
 47 SDataType Pop(SeqStack *S) /*出栈*/
 48 {
 49     if (StackEmpty(S))
 50         Error("Stack underflow"); /*下溢退出*/
 51     else
 52         return S->data[S->top--]; /*栈顶指针返回后将栈顶指针减1*/
 53 }
 54 
 55 SDataType StackTop(SeqStack *S) /*取栈顶元素*/
 56 {
 57     if (StackEmpty(S))
 58         Error("STACK EMPTY!\n");
 59     return S->data[S->top];
 60 }
 61 
 62 main()
 63 {
 64     BTree T;
 65     char ch1,ch2;
 66     printf("\nPLEASE SELECT:\n");
 67     ch1=y;
 68     while(ch1==y || ch1==Y)
 69     {
 70         printf("\nA------------------------CREATE BITREE");
 71         printf("\nB-------------------------DLR(NO DI IGU)");
 72         printf("\nC----------------------Middle(NO DI IGU)");
 73         printf("\nD----------------------Latter(NO DI IGU)");
 74         printf("\nE-------------------------EXIT\n");
 75         scanf("\n%c",&ch2);
 76         switch(ch2)
 77         {
 78         case A:
 79         case a:printf("INPUT NODE:\n");
 80         CreateBTree(&T);
 81         printf("CREATE SUCC\n");break;
 82         case B:
 83         case b:printf("BIAN LI JIE GUO\n");
 84                     PreorderN(T);break;
 85         case C:
 86         case c:printf("Middle Bian Li Jie Guo\n");
 87             MiddleN(T);break;
 88         case D:
 89         case d:printf("Latter Bian Li Jie Guo\n");
 90             LatterN(T);break;
 91         case E:
 92         case e:ch1=n;break;
 93         default:ch1=n;
 94         }
 95     }
 96 }
 97 void CreateBTree(BTree *T)
 98 {
 99     char ch;
100     scanf("\n%c",&ch);
101     if (ch==0)
102         *T=NULL;
103     else 
104     {
105         *T=(Bnode*)malloc(sizeof(Bnode));
106         (*T)->data=ch;
107         CreateBTree(&(*T)->lchild);
108         CreateBTree(&(*T)->rchild);
109     }
110 }
111 void PreorderN(BTree T)
112 {/*先序遍历二叉树T的非递归算法*/
113     SeqStack *S;
114     BTree p;
115     p = T;
116     S = InitStack(); 
117     while(!StackEmpty(S) || p != NULL)
118     {
119         if(p)
120         {    
121             printf("%3c",p->data); /*访问入栈结点的数据域*/
122             Push(S,p); /*向左走到尽头*/
123             p = p->lchild;
124         }
125         else
126         {
127             p =    Pop(S);
128             p = p->rchild;
129         }
130     }
131 }/*PreorderN */
132 
133 void MiddleN(BTree T)
134 {
135     SeqStack *S;
136     BTree p;
137     p = T;
138     S = InitStack(); 
139     while(!StackEmpty(S) || p != NULL)
140     {
141         if(p)
142         {    
143              /*向左走到尽头*/
144             Push(S,p);
145             p = p->lchild;
146         }    
147         else
148         {
149             p =    Pop(S);
150             printf("%3c",p->data);/*访问入栈结点的数据域*/
151             p = p->rchild;
152         }
153     }
154 }
155 
156 void LatterN(BTree T)
157 {
158     SeqStack *S1,*S2;
159     BTree p;
160     p = T;
161     S1 = InitStack(); 
162     S2 = InitStack(); 
163     while(!StackEmpty(S1) || p != NULL)
164     {
165         if(p)
166         {    
167              /*向左走到尽头*/
168             Push(S1,p);
169             Push(S2,p);
170             p = p->rchild;
171         }    
172         else
173         {
174             p =    Pop(S1);
175             p = p->lchild;
176         }        
177     }
178     while(!StackEmpty(S2))
179     {
180         p = Pop(S2);
181         printf("%3c",p->data);/*访问入栈结点的数据域*/
182     }
183 }  

 

数据结构设计——二叉树实现

标签:target   erro   define   lan   算法   cas   ini   font   title   

原文地址:https://www.cnblogs.com/a1982467767/p/8893567.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!