Skip to content

Commit 27dd18f

Browse files
committed
改进数据结构代码
1 parent cd16b94 commit 27dd18f

9 files changed

+1002
-986
lines changed

DataStructure/BinaryTree.cpp

+102-118
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#include<stdio.h>
2-
#include<stdlib.h>
1+
#include <stdio.h>
2+
#include <stdlib.h>
33

44
#define TRUE 1
55
#define FALSE 0
@@ -8,7 +8,6 @@
88
#define OVERFLOW -1
99
#define SUCCESS 1
1010
#define UNSUCCESS 0
11-
1211
#define dataNum 5
1312
int i = 0;
1413
int dep = 0;
@@ -17,180 +16,165 @@ char data[dataNum] = { 'A', 'B', 'C', 'D', 'E' };
1716
typedef int Status;
1817
typedef char TElemType;
1918

19+
// 二叉树结构
2020
typedef struct BiTNode
2121
{
22-
TElemType data;
23-
struct BiTNode *lchild, *rchild;
22+
TElemType data;
23+
struct BiTNode *lchild, *rchild;
2424
}BiTNode, *BiTree;
2525

26-
void InitBiTree(BiTree &T); //创建一颗空二叉树
27-
BiTree MakeBiTree(TElemType e, BiTree L, BiTree R); //创建一颗二叉树T,其中根节点的值为e,L和R分别作为左子树和右子树
28-
void DestroyBiTree(BiTree &T); //销毁二叉树
29-
Status BiTreeEmpty(BiTree T); //对二叉树判空。若为空返回TRUE,否则FALSE
30-
Status BreakBiTree(BiTree &T, BiTree &L, BiTree &R); //将一颗二叉树T分解成根、左子树、右子树三部分
31-
Status ReplaceLeft(BiTree &T, BiTree &LT); //替换左子树。若T非空,则用LT替换T的左子树,并用LT返回T的原有左子树
32-
Status ReplaceRight(BiTree &T, BiTree &RT); //替换右子树。若T非空,则用RT替换T的右子树,并用RT返回T的原有右子树
33-
34-
int Leaves(BiTree T);
35-
int Depth(BiTree T);
36-
37-
Status visit(TElemType e);
38-
void UnionBiTree(BiTree &Ttemp);
39-
40-
41-
//InitBiTree空二叉树是只有一个BiTree指针?还是有一个结点但结点域为空?
26+
// 初始化一个空树
4227
void InitBiTree(BiTree &T)
4328
{
44-
T = NULL;
29+
T = NULL;
4530
}
4631

32+
// 构建二叉树
4733
BiTree MakeBiTree(TElemType e, BiTree L, BiTree R)
4834
{
49-
BiTree t;
50-
t = (BiTree)malloc(sizeof(BiTNode));
51-
if (NULL == t) return NULL;
52-
t->data = e;
53-
t->lchild = L;
54-
t->rchild = R;
55-
return t;
35+
BiTree t;
36+
t = (BiTree)malloc(sizeof(BiTNode));
37+
if (NULL == t) return NULL;
38+
t->data = e;
39+
t->lchild = L;
40+
t->rchild = R;
41+
return t;
5642
}
57-
43+
44+
// 访问结点
5845
Status visit(TElemType e)
5946
{
60-
printf("%c", e);
61-
return OK;
47+
printf("%c", e);
48+
return OK;
6249
}
6350

64-
65-
int Leaves(BiTree T) //对二叉树T求叶子结点数目
51+
// 对二叉树T求叶子结点数目
52+
int Leaves(BiTree T)
6653
{
67-
int l = 0, r = 0;
68-
69-
if (NULL == T) return 0;
70-
if (NULL == T->lchild && NULL == T->rchild) return 1;
71-
72-
//问题分解,2个子问题
73-
74-
75-
//求左子树叶子数目
76-
l = Leaves(T->lchild);
77-
78-
//求右子树叶子数目
79-
r = Leaves(T->rchild);
80-
81-
//组合
82-
return r + l;
54+
int l = 0, r = 0;
55+
if (NULL == T) return 0;
56+
if (NULL == T->lchild && NULL == T->rchild) return 1;
57+
58+
// 求左子树叶子数目
59+
l = Leaves(T->lchild);
60+
// 求右子树叶子数目
61+
r = Leaves(T->rchild);
62+
// 组合
63+
return r + l;
8364
}
8465

85-
int depTraverse(BiTree T) //层次遍历:dep是个全局变量,高度
66+
// 层次遍历:dep是个全局变量,高度
67+
int depTraverse(BiTree T)
8668
{
87-
if (NULL == T) return ERROR;
69+
if (NULL == T) return ERROR;
8870

89-
dep = (depTraverse(T->lchild) > depTraverse(T->rchild)) ? depTraverse(T->lchild) : depTraverse(T->rchild);
71+
dep = (depTraverse(T->lchild) > depTraverse(T->rchild)) ? depTraverse(T->lchild) : depTraverse(T->rchild);
9072

91-
return dep + 1;
73+
return dep + 1;
9274
}
9375

94-
95-
void levTraverse(BiTree T, Status(*visit)(TElemType e), int lev) //高度遍历:lev是局部变量,层次
76+
// 高度遍历:lev是局部变量,层次
77+
void levTraverse(BiTree T, Status(*visit)(TElemType e), int lev)
9678
{
97-
if (NULL == T) return;
98-
99-
visit(T->data);
100-
printf("的层次是%d\n", lev);
101-
102-
levTraverse(T->lchild, visit, ++lev);
103-
levTraverse(T->rchild, visit, lev);
79+
if (NULL == T) return;
80+
visit(T->data);
81+
printf("的层次是%d\n", lev);
10482

83+
levTraverse(T->lchild, visit, ++lev);
84+
levTraverse(T->rchild, visit, lev);
10585
}
10686

107-
void InOrderTraverse(BiTree T, Status(*visit)(TElemType e), int &num) //num是个全局变量
87+
// num是个全局变量
88+
void InOrderTraverse(BiTree T, Status(*visit)(TElemType e), int &num)
10889
{
109-
if (NULL == T) return;
110-
visit(T->data);
111-
if (NULL == T->lchild && NULL == T->rchild) { printf("是叶子结点"); num++; }
112-
else printf("不是叶子结点");
113-
printf("\n");
114-
InOrderTraverse(T->lchild, visit, num);
115-
InOrderTraverse(T->rchild, visit, num);
90+
if (NULL == T) return;
91+
visit(T->data);
92+
if (NULL == T->lchild && NULL == T->rchild) { printf("是叶子结点"); num++; }
93+
else printf("不是叶子结点");
94+
printf("\n");
95+
InOrderTraverse(T->lchild, visit, num);
96+
InOrderTraverse(T->rchild, visit, num);
11697
}
11798

99+
// 二叉树判空
118100
Status BiTreeEmpty(BiTree T)
119101
{
120-
if (NULL == T) return TRUE;
121-
return FALSE;
102+
if (NULL == T) return TRUE;
103+
return FALSE;
122104
}
123105

106+
// 打断二叉树:置空二叉树的左右子树
124107
Status BreakBiTree(BiTree &T, BiTree &L, BiTree &R)
125108
{
126-
if (NULL == T) return ERROR;
127-
L = T->lchild;
128-
R = T->rchild;
129-
T->lchild = NULL;
130-
T->rchild = NULL;
131-
return OK;
109+
if (NULL == T) return ERROR;
110+
L = T->lchild;
111+
R = T->rchild;
112+
T->lchild = NULL;
113+
T->rchild = NULL;
114+
return OK;
132115
}
133116

117+
// 替换左子树
134118
Status ReplaceLeft(BiTree &T, BiTree &LT)
135119
{
136-
BiTree temp;
137-
if (NULL == T) return ERROR;
138-
temp = T->lchild;
139-
T->lchild = LT;
140-
LT = temp;
141-
return OK;
120+
BiTree temp;
121+
if (NULL == T) return ERROR;
122+
temp = T->lchild;
123+
T->lchild = LT;
124+
LT = temp;
125+
return OK;
142126
}
143127

128+
// 替换右子树
144129
Status ReplaceRight(BiTree &T, BiTree &RT)
145130
{
146-
BiTree temp;
147-
if (NULL == T) return ERROR;
148-
temp = T->rchild;
149-
T->rchild = RT;
150-
RT = temp;
151-
return OK;
131+
BiTree temp;
132+
if (NULL == T) return ERROR;
133+
temp = T->rchild;
134+
T->rchild = RT;
135+
RT = temp;
136+
return OK;
152137
}
153138

139+
// 合并二叉树
154140
void UnionBiTree(BiTree &Ttemp)
155141
{
156-
BiTree L = NULL, R = NULL;
157-
L = MakeBiTree(data[i++], NULL, NULL);
158-
R = MakeBiTree(data[i++], NULL, NULL);
159-
ReplaceLeft(Ttemp, L);
160-
ReplaceRight(Ttemp, R);
142+
BiTree L = NULL, R = NULL;
143+
L = MakeBiTree(data[i++], NULL, NULL);
144+
R = MakeBiTree(data[i++], NULL, NULL);
145+
ReplaceLeft(Ttemp, L);
146+
ReplaceRight(Ttemp, R);
161147
}
162148

163-
164149
int main()
165150
{
151+
BiTree T = NULL, Ttemp = NULL;
166152

167-
BiTree T = NULL, Ttemp = NULL;
168-
169-
InitBiTree(T);
170-
if (TRUE == BiTreeEmpty(T)) printf("初始化T为空\n");
171-
else printf("初始化T不为空\n");
153+
InitBiTree(T);
154+
if (TRUE == BiTreeEmpty(T)) printf("初始化T为空\n");
155+
else printf("初始化T不为空\n");
172156

173-
T = MakeBiTree(data[i++], NULL, NULL);
157+
T = MakeBiTree(data[i++], NULL, NULL);
174158

175-
Ttemp = T;
176-
UnionBiTree(Ttemp);
159+
Ttemp = T;
160+
UnionBiTree(Ttemp);
177161

178-
Ttemp = T->lchild;
179-
UnionBiTree(Ttemp);
162+
Ttemp = T->lchild;
163+
UnionBiTree(Ttemp);
180164

165+
Status(*visit1)(TElemType);
166+
visit1 = visit;
167+
int num = 0;
168+
InOrderTraverse(T, visit1, num);
169+
printf("叶子结点是 %d\n", num);
181170

182-
Status(*visit1)(TElemType);
183-
visit1 = visit;
184-
int num = 0;
185-
InOrderTraverse(T, visit1, num);
186-
printf("叶子结点是 %d\n", num);
171+
printf("叶子结点是 %d\n", Leaves(T));
187172

188-
printf("叶子结点是 %d\n", Leaves(T));
173+
int lev = 1;
174+
levTraverse(T, visit1, lev);
189175

190-
int lev = 1;
191-
levTraverse(T, visit1, lev);
176+
printf("高度是 %d\n", depTraverse(T));
192177

193-
printf("高度是 %d\n", depTraverse(T));
194-
195-
return 0;
178+
getchar();
179+
return 0;
196180
}

0 commit comments

Comments
 (0)