二叉树源代码
二叉树数据结构TreeNode.h
头文件
1 | //树结构 |
栈结构
头文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//栈结构
struct LinkStack {
Ptr top;//栈顶
int count;
};
typedef struct LinkStack *Stack;
//创建栈
Stack InitStack(void);
//栈是否空
bool IsEmptyStack(Stack stack);
//入栈
void PushStack(Stack stack, ElementType val);
//出栈
void PopStack(Stack stack, ElementType *val);
实现文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45//创建栈
Stack InitStack(void)
{
//可能分配失败 内存不足
Stack stack = (Stack)malloc(sizeof(struct LinkStack));
if (!stack) {
printf("分配内存失败\n");
return NULL;
}
stack->top = NULL;
stack->count = 0;
return stack;
}
//栈是否空
bool IsEmptyStack(Stack stack)
{
return stack->top ? 0 : 1;
}
//入栈
void PushStack(Stack stack, ElementType val)
{
Ptr p = (Ptr)malloc(sizeof(struct Node));
if (!p) {
printf("分配内存失败\n");
exit(-1);
}
p->data = val;
p->next = stack->top;
stack->top = p;
stack->count++;
}
//出栈
void PopStack(Stack stack, ElementType *val)
{
if (!IsEmptyStack(stack)) {
Ptr p = stack->top;
*val = p->data;
stack->top = p->next;
stack->count--;
free(p);
}
}
队列结构
头文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//队列结构
struct LinkQueue {
Ptr front;//队头
Ptr rear;//队尾
int count;
};
typedef struct LinkQueue *Queue;
//创建队列
Queue InitQueue(void);
//队列是否空
bool IsEmptyQueue(Queue queue);
//入队
void InsertQueue(Queue queue, ElementType val);
//出队
void DeleteQueue(Queue queue, ElementType *val);
实现文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63//带头结点
//创建队列
Queue InitQueue(void)
{
Queue queue = (Queue)malloc(sizeof(struct LinkQueue));
queue->front = queue->rear = (Ptr)malloc(sizeof(struct Node));
if (!queue || !queue->front) {
printf("分配内存失败\n");
return NULL;
}
queue->front->next = NULL;
queue->count = 0;
return queue;
}
//队列是否空
bool IsEmptyQueue(Queue queue)
{
if (queue->front == queue->rear) {
return true;
}
else {
return false;
}
}
//入队
void InsertQueue(Queue queue, ElementType val)
{
Ptr p = (Ptr)malloc(sizeof(struct Node));
if (!p) {
printf("分配内存失败\n");
exit(-1);
}
p->data = val;
p->next = NULL;
queue->rear->next = p;
queue->rear = p;
queue->count += 1;
}
//出队
void DeleteQueue(Queue queue, ElementType *val)
{
if (!IsEmptyQueue(queue)) {
Ptr p = queue->front->next;
*val = p->data;
queue->front->next = p->next;
queue->count -= 1;
//若队头是队尾,则删除后要将rear指向头结点
if (queue->rear == p) {
queue->rear = queue->front;
}
free(p);
}
else {
printf("队空\n");
}
}
二叉树实现
实现文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
//创建树
BinTree createTree()
{
BinTree tree;
char str = getchar();
if (str == '#') {
tree = NULL;
}
else {
tree = (BinTree)malloc(sizeof(struct TreeNode));
tree->data = str;
tree->left = createTree();
tree->right = createTree();
}
return tree;
}
//先序 根左右
void preOrderTraversal(BinTree bt)
{
if (bt) {
printf("%c ",bt->data);
preOrderTraversal(bt->left);
preOrderTraversal(bt->right);
}
}
//中序 左根右
void inOrderTraversal(BinTree bt)
{
if (bt) {
inOrderTraversal(bt->left);
printf("%c ",bt->data);
inOrderTraversal(bt->right);
}
}
//后序 左右根
void postOrderTraversal(BinTree bt)
{
if (bt) {
postOrderTraversal(bt->left);
postOrderTraversal(bt->right);
printf("%c ",bt->data);
}
}
//有左子树就入栈
//先序
void preOrderTraversalIter(BinTree bt)
{
BinTree T = bt;
Stack s = InitStack();
while (T || !IsEmptyStack(s)) {
//一直向左并将沿途经点入栈
if (T) {
printf("%c ", T->data);
PushStack(s, T);
T = T->left;
}
else {
PopStack(s, &T);
//转向右子树
T = T->right;
}
}
}
//中序
void inOrderTraversalIter(BinTree bt)
{
BinTree T = bt;
Stack s = InitStack();
while (T || !IsEmptyStack(s)) {
//一直向左并将沿途经点入栈
if (T) {
PushStack(s, T);
T = T->left;
}
else {
PopStack(s, &T);
printf("%c ", T->data);
//转向右子树
T = T->right;
}
}
}
//有右子树就入栈
//后序
void postOrderTraversalIter(BinTree bt)
{
BinTree T = bt;
Stack s1 = InitStack();
Stack s2 = InitStack();
while (T || !IsEmptyStack(s2)) {
if (T) {
PushStack(s1, T);
PushStack(s2, T);
T = T->right;
}
else {
PopStack(s2, &T);
T = T->left;
}
}
while (!IsEmptyStack(s1)) {
PopStack(s1, &T);
printf("%c ", T->data);
}
}
//层次遍历
void levelOrderTraversal(BinTree bt)
{
if (bt) {
Queue q = InitQueue();
BinTree T;
InsertQueue(q, bt);
while (!IsEmptyQueue(q)) {
DeleteQueue(q, &T);
printf("%c ", T->data);
if (T->left) {
InsertQueue(q, T->left);
}
if (T->right) {
InsertQueue(q, T->right);
}
}
}
}
//二叉树高度
int height(BinTree bt)
{
int h1,h2;
if (bt == NULL) {
return 0;
}
else {
h1 = height(bt->left);
h2 = height(bt->right);
return (h1 > h2 ? h1 : h2) + 1;
}
}
//每层结点个数
void levelCount(BinTree bt, int l, int num[])
{
if (bt) {
num[l]++;
levelCount(bt->left, l + 1, num);
levelCount(bt->right, l + 1, num);
}
}
//结点总数
int countTree(BinTree bt)
{
int lcount,rcount;
if (bt == NULL) {
return 0;
}
lcount = countTree(bt->left);
rcount = countTree(bt->right);
return lcount + rcount + 1;
}
//测试二叉树
void test()
{
// ABD#G###CE##FH###
BinTree tree = createTree();
printf("先序递归遍历:");
preOrderTraversal(tree);
printf("\n");
printf("先序非递归遍历:");
preOrderTraversalIter(tree);
printf("\n");
printf("中序递归遍历:");
inOrderTraversal(tree);
printf("\n");
printf("中序非递归遍历:");
inOrderTraversalIter(tree);
printf("\n");
printf("后序递归遍历:");
postOrderTraversal(tree);
printf("\n");
printf("后序非递归遍历:");
postOrderTraversalIter(tree);
printf("\n");
printf("层次遍历:");
levelOrderTraversal(tree);
printf("\n");
int treeHeight = height(tree);
printf("树深度:%d\n",treeHeight);
int count = countTree(tree);
printf("结点总数:%d\n",count);
int l = 1;
int *t = (int *)malloc(sizeof(int) * (treeHeight + 1));
for (int i = 0; i < treeHeight + 1; i++) {
t[i] = 0;
}
levelCount(tree, l, t);
for(int i = 1; i <= treeHeight; i++){
printf("第%d层数目: %d\n",i,t[i]);
}
}