数据结构与算法:二叉树的创建,插入,遍历,删除实现

二叉树是每个结点最多有两个子树的树结构。使用广泛,使用C来实现对二叉树的操作。

示例:代码实现构造如下二叉树

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
226
227
228
229
230
231
232
233
#include <iostream>

using namespace std;

typedef struct BinaryTree
{
int data;
struct BinaryTree* lchild;
struct BinaryTree* rchild;
}BiTNode;


/************************************
@ Brief: 二叉树中插入节点
@ Author: woniu201
@ Created: 2019/07/10
@ Return:
************************************/
void insertNode(BiTNode** node, int val)
{
BiTNode* tmpNode = NULL;
if (!(* node))
{
tmpNode = (BiTNode*)malloc(sizeof(BiTNode));
memset(tmpNode, 0, sizeof(BiTNode));
tmpNode->data = val;
*node = tmpNode;
return;
}
if (val < (*node)->data)
{
insertNode(&(*node)->lchild, val);
}
else if (val > (*node)->data)
{
insertNode(&(*node)->rchild, val);
}
return;
}

/************************************
@ Brief: 删除节点
@ Author: woniu201
@ Created: 2019/07/10
@ Return: 参考:https://blog.csdn.net/Future_LL/article/details/79968437
************************************/
void delNode(BiTNode* node, int val)
{
BiTNode *L, *LL; //在删除左右子树都有的结点时使用;
BiTNode *p = node;
BiTNode *parent = node;

int child = 0; //0表示左子树,1表示右子树;

if (!node) //如果排序树为空,则退出;
{
return;
}
while (p) //二叉排序树有效;
{
if (p->data == val)
{
if (!p->lchild && !p->rchild) //叶结点(左右子树都为空);
{
if (p == node) //被删除的结点只有根结点;
free(p);
else if (child == 0)
{
parent->lchild = NULL; //设置父结点左子树为空;
free(p); //释放结点空间;
}
else //父结点为右子树;
{
parent->rchild = NULL; //设置父结点右子树为空;
free(p); //释放结点空间;
}
}

else if (!p->lchild) //左子树为空,右子树不为空;
{
if (child == 0) //是父结点的左子树;
parent->lchild = p->rchild;
else //是父结点的右子树;
parent->rchild = p->rchild;
free(p); //释放被删除的结点;
}

else if (!p->rchild) //右子树为空,左子树不为空;
{
if (child == 0) //是父结点的左子树;
parent->lchild = p->lchild;
else //是父结点的右子树;
parent->rchild = p->lchild;
free(p); //释放被删除的结点;
}

else
{
LL = p; //保存左子树的结点;
L = p->rchild; //从当前结点的右子树进行查找;
if (L->lchild) //左子树不为空;
{
LL = L;
L = L->lchild; //查找左子树;
p->data = L->data; //将左子树的数据保存到被删除结点;
LL->lchild = L->lchild; //设置父结点的左子树指针为空;
for (; L->lchild; L = L->lchild);
L->lchild = p->lchild;
p->lchild = NULL;
}
else
{
p->data = L->data;
LL->rchild = L->rchild;
}
}
p = NULL;
}
else if (val < p->data) //需删除记录的关键字小于结点的数据;
{
//要删除的结点p是parent的左子树;
child = 0; //标记在当前结点左子树;
parent = p;//保存当前结点作为父结点;
p = p->lchild; //查找左子树;
}
else //需删除记录的关键字大于结点的数据;
{
//要删除的结点p是parent的右子树;
child = 1; //标记在当前结点右子树查找;
parent = p; //保存当前结点作为父结点;
p = p->rchild; //查找右子树;
}
}
return;
}

/************************************
@ Brief: 删除树
@ Author: woniu201
@ Created: 2019/07/10
@ Return:
************************************/
void delTree(BiTNode* node)
{
if (node)
{
delTree(node->lchild);
delTree(node->rchild);
free(node);
node = NULL;
}
}

/************************************
@ Brief: 前序遍历
@ Author: woniu201
@ Created: 2019/07/10
@ Return:
************************************/
void proorder(BiTNode* node)
{
if (node)
{
printf("%d ", node->data);
proorder(node->lchild);
proorder(node->rchild);
}
}

/************************************
@ Brief: 中序遍历
@ Author: woniu201
@ Created: 2019/07/10
@ Return:
************************************/
void inorder(BiTNode* node)
{
if (node)
{
inorder(node->lchild);
printf("%d ", node->data);
inorder(node->rchild);
}
}

/************************************
@ Brief: 后序遍历
@ Author: woniu201
@ Created: 2019/07/10
@ Return:
************************************/
void postorder(BiTNode* node)
{
if (node)
{
postorder(node->lchild);
postorder(node->rchild);
printf("%d ", node->data);
}
}

int main()
{
BiTNode* node = NULL;
insertNode(&node, 10);
insertNode(&node, 15);
insertNode(&node, 8);
insertNode(&node, 9);
insertNode(&node, 17);
insertNode(&node, 6);
insertNode(&node, 11);

//前序遍历
printf("先序遍历:\n");
proorder(node);

//中序遍历
printf("\n中序遍历:\n");
inorder(node);


//后序遍历
printf("\n后序遍历:\n");
postorder(node);

//删除节点
delNode(node, 15);

//删除树
delTree(node);

return 1;
}

#

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×