1 #include
2 #include
3 #include
4 typedefchar ElemType; //定义树的结点类型
5 typedefstruct BiTNode
6 {
7 ElemType data;
8 struct BiTNode *lchild;
9 struct BiTNode *rchild;
10 }BiTNode,*BiTree;
11 //创建空二叉树
12 void InitBiTree(BiTree &T)
13 {
14 T = NULL;
15 }
16 //二叉树的创建
17 void CreateBiTree(BiTree &T)
18 {
19 char ch;
20 scanf("%c",&ch);
21 if(ch == ' ')
22 {
23 T=NULL; //截止二叉树的建立
24 }
25 else
26 {
27 T = (BiTNode *) malloc(sizeof(BiTNode)); //申请结点空间
28 if(!T)
29 exit(0);
30 T-<data = ch;
31 CreateBiTree(T-<lchild); //构造左子树
32 CreateBiTree(T-<rchild); //构造右子树
33 }
34 }
35 ////////////////////////////////////////////
36 //二叉树的先序遍历
37 void PreOrderTraverse(BiTNode *p)
38 {
39 if(p != NULL)
40 {
41 printf("%c*",p-<data);
42 PreOrderTraverse(p-<lchild);
43 PreOrderTraverse(p-<rchild);
44 }
45 }
46 //二叉树的中序遍历
47 void InOrderTraverse(BiTNode *p)
48 {
49 if(p != NULL)
50 {
51 InOrderTraverse(p-<lchild);
52 printf("%c*",p-<data);
53 InOrderTraverse(p-<rchild);
54 }
55 }
56 //二叉树的后序遍历
57 void PostOrderTraverse(BiTNode *p)
58 {
59 if(p != NULL)
60 {
61 PostOrderTraverse(p-<lchild);
62 PostOrderTraverse(p-<rchild);
63 printf("%c*",p-<data);
64 }
65 }
66 //求二叉树的高度
67 int High(BiTNode *p)
68 {
69 int lh=0;
70 int rh=0;
71 if(p == NULL)
72 {
73 return 0;
74 }
75 lh=High(p-<lchild);
76 rh=High(p-<rchild);
77 if(lh<rh)
78 {
79 return lh+1;
80 }
81 else
82 {
83 return rh+1;
84 }
85 }
86 //求二叉树的结点数目
87 int Count(BiTree T)
88 {
89 if(T == NULL)
90 {
91 return 0;
92 }
93 return Count(T-<lchild)+Count(T-<rchild)+1;
94 }
95 //实现左右子树的交换
96 void exchange(BiTree T)
97 {
98 if(T == NULL)
99 {
100 return;
101 }
102 else
103 {
104 BiTree temp=T-<lchild;
105 T-<lchild = T-<rchild;
106 T-<rchild = temp;
107 exchange(T-<lchild);
108 exchange(T-<rchild);
109 }
110 }
111 //前序遍历的非递归算法
112 void PreTraverse(BiTree T)
113 {
114 BiTree p;
115 p=T;
116 stack S;
117 S.IintStack();
118 while(p || S.StackEmpty())
119 {
120 if(p)
121 {
122 printf("%d",p-<data);
123 Push(&S,p);
124 p=p-<lchild;
125 }
126 else
127 {
128 S.pop(p);
129 p=p-<rchild;
130 }
131 }
132 }
133 //中序遍历的非递归算法
134 void InTraverse(BiTree T)
135 {
136 BiTree p;
137 p=T;
138 stack S;
139 S.IintStack();
140 while(p || S.StackEmpty())
141 {
142 if(p)
143 {
144 Push(&S,p);
145 p=p-<lchild;
146 }
147 else
148 {
149 S.pop(p);
150 printf("%d",p-<data);
151 p=p-<rchild;
152 }
153 }
154 }
155 //后序遍历的非递归算法
156 #define MaxSize 100
157 void PostTraverse(BiTree T)
158 {
159 BiTree p;
160 stack S;
161 int intstack[MaxSize];
162 int i;
163 int top;
164 p=T;
165 //S.IintStack();
166 for(int i=0;i<100 ispan>
167 {
168 intstack[i]=0;
169 }
170 top=0;
171 while(p || S.empty())
172 {
173 if(p)
174 {
175 Push(&S,p);
176 intstack[top]=0;
177 top++;
178 p=p-<lchild;
179 }
180 else
181 {
182 if(intstack[top-1] == 0)
183 {
184 GetTop(S,&p);
185 intstack[top-1]=1;
186 p=p-<rchild;
187 }
188 else
189 {
190 Pop(&S,&p);
191 top--;
192 printf("%d",p-<data);
193 p=NULL;
194 }
195 }
196 }
197 }
198 int main()
199 {
200 BiTree T;
201 CreateBiTree(T);
202 PreOrderTraverse(T);
203 printf("\n");
204 InOrderTraverse(T);
205 printf("\n");
206 PostOrderTraverse(T);
207 printf("\n");
208 int a=High(T);
209 int b=Count(T);
210 exchange(T);
211 return 0;
212 }