由于学习进度的原因,二叉树没有在3月12日植树节那天学习,现在乘者3月15日的日子,将学习的内容代码部分发布,网友可以在编程环境下运行。
这里采用二叉链表,实现的代码见下:
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using QueueStack;
5![]()
6
namespace 二叉链表
7
{
8
class Program
9
{
10
public class Node<T>
11
{
12
//数据域
13
private T data;
14
//左孩子
15
private Node<T> Lchild;
16
//右孩子
17
private Node<T> Rchild;
18
//构造函数
19
public Node(T val, Node<T> lp, Node<T> rp)
20
{
21
data = val;
22
Lchild = lp;
23
Rchild = rp;
24
}
25
//构造函数
26
public Node(Node<T> lp, Node<T> rp)
27
{
28
data=default(T);
29
Lchild = lp;
30
Rchild = rp;
31
}
32
//构造函数
33
public Node(T val)
34
{
35
data = val;
36
Lchild = null;
37
Rchild = null;
38
}
39
//构造函数
40
public Node()
41
{
42
data=default(T);
43
Lchild = null;
44
Rchild = null;
45
}
46
//数据属性
47
public T Data
48
{
49
get
50
{
51
return data;
52
}
53
set
54
{
55
data = value;
56
}
57
}
58
//左孩子属性
59
public Node<T> LChild
60
{
61
get
62
{
63
return Lchild;
64
}
65
set
66
{
67
Lchild = value;
68
}
69
}
70
//右孩子属性
71
public Node<T> RChild
72
{
73
get
74
{
75
return Rchild;
76
}
77
set
78
{
79
Rchild = value;
80
}
81
}
82
83![]()
84
}
85
public class BiTree<T>
86
{
87
//头引用
88
private Node<T> head;
89
//头属性
90
public Node<T> Head
91
{
92
get
93
{
94
return head;
95
}
96
set
97
{
98
head = value;
99
}
100![]()
101
}
102
//构造函数
103
public BiTree(T val)
104
{
105
Node<T> p = new Node<T>(val);
106
head = p;
107
}
108
//构造函数
109
public BiTree(T val, Node<T> lp, Node<T> rp)
110
{
111
Node<T> p = new Node<T>(val, lp, rp);
112
head = p;
113
}
114
//构造函数
115
public BiTree()
116
{
117
head = null;
118
}
119
//判断是否为空
120
public bool IsEmpty()
121
{
122
if (head == null)
123
{
124
return true;
125
}
126
else
127
{
128
return false;
129
}
130
}
131
//获取根节点
132
public Node<T> Root()
133
{
134
return head;
135
}
136
//获取节点左孩子节点
137
public Node<T> GetChildL(Node<T> p)
138
{
139
return p.LChild;
140
}
141
//获取节点右孩子节点
142
public Node<T> GetChildR(Node<T> p)
143
{
144
return p.RChild;
145
}
146
//将节点P的左子树插入值为VAL的新节点,原来节点的左子树成为新节点的左子树
147
public void InsertL(T val, Node<T> p)
148
{
149
Node<T> tmp = new Node<T>(val);
150
tmp.LChild = p.LChild;
151
p.LChild = tmp;
152
}
153
//将节点P的右子树插入值为VAL的新节点,原来节点的左子树成为新节点的右子树
154
public void InsertR(T val, Node<T> p)
155
{
156
Node<T> tmp = new Node<T>(val);
157
tmp.RChild = p.RChild;
158
p.RChild = tmp;
159
}
160
//若p非空,删除P的左子树
161
public Node<T> DeleteL(Node<T> p)
162
{
163
if ((p == null) && (p.LChild == null))
164
{
165
return null;
166
}
167
Node<T> tmp = p.LChild;
168
p.LChild = null;
169
return tmp;
170
}
171
//若p非空,删除P的右子树
172
public Node<T> DeleteR(Node<T> p)
173
{
174
if ((p == null) && (p.LChild == null))
175
{
176
return null;
177
}
178
Node<T> tmp = p.RChild;
179
p.RChild = null;
180
return tmp;
181
}
182
//判断是否为叶子节点
183
public bool IsLeaf(Node<T> p)
184
{
185
if ((p != null) && (p.LChild != null) && (p.RChild != null))
186
{
187
return true;
188
}
189
else
190
{
191
return false;
192
}
193
}
194![]()
195
//先序遍历DLR
196
public void PreOrder(Node<T> root)
197
{
198
//根节点为空,结束
199
if (root == null)
200
{
201
return;
202
}
203
//处理根节点
204
Console.WriteLine(root.Data);
205
//遍历左子树
206
PreOrder(root.LChild);
207
//遍历右子树
208
PreOrder(root.RChild);
209
}
210
//中序遍历LDR
211
public void InOrder(Node<T> root)
212
{
213
//根节点为空
214
if (root == null)
215
{
216
return;
217
}
218![]()
219
//中序遍历左子树
220
InOrder(root.LChild);
221
Console.WriteLine(root.Data);
222
//中序遍历右子树
223
InOrder(root.RChild);
224
}
225
//后序遍历LRD
226
public void PostOrder(Node<T> root)
227
{
228
//根节点为空
229
if (root == null)
230
{
231
return;
232
}
233![]()
234
//后序遍历左子树
235
PostOrder(root.LChild);
236
//后序遍历右子树
237
PostOrder(root.RChild);
238
Console.WriteLine(root.Data);
239
}
240
//层序遍历Level Order
241
public void LevelOrder(Node<T> root)
242
{
243
//根节点为空
244
if (root == null)
245
{
246
return;
247
}
248
//设置一个队列保存层序遍历的节点
249
QueueStack.queue.SeqQueue<T> queue = new queue.SeqQueue<T>(50);
250
//根队列入队
251
queue.In(root);
252
//队列非空,节点没有处理完成
253
while (!queue.IsEmpty())
254
{
255
//节点出队
256
Node<T> tmp = queue.Out();
257
//处理当前节点
258
Console.WriteLine("{0}", tmp);
259
//左孩子入队
260
if (root.LChild != null)
261
{
262
queue.In(root.LChild);
263
}
264
//右孩子入队
265
if (root.RChild != null)
266
{
267
queue.In(root.RChild);
268
}
269
}
270![]()
271
}
272![]()
273
}
274
275
static void Main(string[] args)
276
{
277
Node<int> p = new Node<int>(12);
278
Node<int> q = new Node<int>(20);
279
BiTree<int> bt = new BiTree<int>(50,p,q);
280
//插入左子树
281
bt.InsertL(60,p);
282
//插入右子树
283
bt.InsertR(70,q);
284
//先序遍历
285
bt.PreOrder(bt.Root());
286
//中序遍历
287
bt.InOrder(bt.Root());
288
//后序遍历
289
bt.PostOrder(bt.Root());
290
//层序遍历
291
bt.LevelOrder(bt.Root());
292![]()
293
}
294
}
295
}
296![]()

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

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296
