1 #include<stdio.h>
2 #include<stdlib.h>
3 #define Stack_Size 100
4 #define StackIncrement 10
5 #define OK 1
6 #define TRUE 1
7 #define FALSE 0
8 #define ERROR 0
9 #define OVERFLOW -2
10 typedef int Status;
11 typedef char TElemType;
12 typedef struct BiTNode
13 {
14 TElemType data;
15 BiTNode *lchild,*rchild;
16 }BiTNode,*BiTree;
17 typedef struct
18 {
19 BiTree *base;
20 BiTree *top;
21 int stacksize;
22 }SqStack;
23 //构造一个顺序栈,用于存放二叉树的部分结点
24 Status InitStack(SqStack &S)
25 {
26 S.base=(BiTree *)malloc(Stack_Size*sizeof(BiTree));
27 if(!S.base) exit(OVERFLOW);
28 S.top=S.base;
29 S.stacksize=Stack_Size;
30 return OK;
31 }
32 Status StackEmpty(SqStack &S)
33 {
34 if(S.top==S.base)
35 return TRUE;
36 return FALSE;
37 }
38 Status StackLength(SqStack S)
39 {
40 return (S.top-S.base);
41 }
42 Status GetTop(SqStack S,BiTree &e)
43 {
44 if(S.top==S.base) return ERROR;
45 e=*(S.top-1);
46 return OK;
47 }
48 Status Push(SqStack &S,BiTree e)
49 {
50 if((S.top-S.base)==S.stacksize)
51 {
52 S.base=(BiTree *)realloc(S.base,(S.stacksize+StackIncrement)*sizeof(BiTree));
53 if(!S.base) exit(OVERFLOW);
54 S.top=S.base+S.stacksize;
55 S.stacksize+=StackIncrement;
56 }
57 *S.top++=e;
58 return OK;
59 }
60 Status Pop(SqStack &S,BiTree &e)
61 {
62 if(S.top==S.base) return ERROR;
63 e=*--S.top;
64 return OK;
65 }
66 Status PrintSqStack(SqStack S)
67 {
68 int i,length=StackLength(S);
69 for(i=length-1;i>=0;i--)
70 printf("%c",S.base[i]->data);
71 putchar('\n');
72 return OK;
73 }
74 //构造一个二叉树
75 Status CreateBiTree(BiTree &T)
76 {
77 char ch;
78 ch=getchar();
79 if(ch==' ') T=NULL;
80 else{
81 if(!(T=new BiTNode)) exit(OVERFLOW);
82 T->data=ch;
83 CreateBiTree(T->lchild);
84 CreateBiTree(T->rchild);
85 }
86 return OK;
87 }
88 //前中后序遍历二叉树
89 Status PreOrderTraverse(BiTree T)
90 {
91 SqStack S;
92 BiTree p;
93 InitStack(S);
94 p=T;
95 while(p||!StackEmpty(S))
96 {
97 if(p) {printf("%c",p->data);Push(S,p);p=p->lchild;}
98 else
99 {
100 Pop(S,p);
101 p=p->rchild;
102 }
103 }
104 return OK;
105 }
106 Status InOrderTraverse(BiTree T)
107 {
108 SqStack S;
109 BiTree p;
110 InitStack(S);
111 p=T;
112 while(p||!StackEmpty(S))
113 {
114 if(p) {Push(S,p);p=p->lchild;}
115 else
116 {
117 Pop(S,p);
118 printf("%c",p->data);
119 p=p->rchild;
120 }
121 }
122 return OK;
123 }
124 Status PostOrderTraverse(BiTree T)
125 {
126 SqStack S1,S2;
127 BiTree p;
128 InitStack(S1);InitStack(S2);
129 p=T;
130 while(p||!StackEmpty(S1))
131 {
132 if(p) {Push(S2,p);Push(S1,p);p=p->rchild;}
133 else
134 {
135 Pop(S1,p);
136 p=p->lchild;
137 }
138 }
139 PrintSqStack(S2);
140 return OK;
141 }
142 //求叶子结点个数和二叉树的深度
143 Status CountLeaf(BiTree T)
144 {
145 int count=0;
146 if(T)
147 {
148 if((!T->lchild)&&(!T->rchild))
149 count++;
150 count+=CountLeaf( T->lchild);
151 count+=CountLeaf( T->rchild);
152 }
153 return count;
154 }
155 Status Depth(BiTree T)
156 {
157 int depthval=0;
158 int depthLeft,depthRight;
159 if(!T) depthval = 0;
160 else
161 {
162 depthLeft = Depth( T->lchild );
163 depthRight= Depth( T->rchild );
164 depthval = 1 + (depthLeft > depthRight ? depthLeft : depthRight);
165 }
166 return depthval;
167 }
168 Status main()
169 {
170 BiTree T;
171 int count,depthval;
172 puts("请前序输入二叉树:");
173 CreateBiTree(T);
174 puts("前序输出二叉树:");
175 PreOrderTraverse(T);
176 puts("\n中序输出二叉树:");
177 InOrderTraverse(T);
178 puts("\n后序输出二叉树:");
179 PostOrderTraverse(T);
180 count=CountLeaf(T);
181 printf("统计叶子的个数为:%d\n",count);
182 depthval=Depth(T);
183 printf("统计树的深度为:%d\n",depthval);
184 system("pause");
185 return OK;
186 }