[ZT]线索二叉树(C#数据结构五)
1
using System;
2
3
namespace BiThrTree
4
{
5
/// <summary>
6
/// 定义结点类:
7
/// </summary>
8
class BTNode
9
{
10
//先序:先处理父结点,然后递归处理孩子
11
//中序:先处理左孩子,再处理根节结,然后递归处理右孩子
12
//后序:先递归处理所有孩子,再递归处理节点本点
13
public char data;
14
public int ltag, rtag;//0表示线索,1表示结点
15
public BTNode lchild, rchild;
16
}
17
class BiThrTree
18
{
19
/// <summary>
20
/// 建立一棵新二叉树:
21
/// </summary>
22
/// <param name="T"></param>
23
static public void CreateBiThrTree(ref BTNode T)
24
{
25
char ch;
26
ch = (char)Console.Read();
27
if (ch == '#')
28
{
29
T = null;
30
}
31
else
32
{
33
T = new BTNode();
34
T.data = ch;
35
CreateBiThrTree(ref T.lchild);
36
CreateBiThrTree(ref T.rchild);
37
}
38
}
39
/// <summary>
40
/// 线索化二叉树:
41
/// </summary>
42
/// <param name="T"></param>
43
static BTNode pre, H;
44
static public void Threading(ref BTNode T)
45
{
46
H = pre = new BTNode();
47
pre.rchild = pre.lchild = null;
48
pre.rtag = pre.ltag = 0;
49
Thread(ref T);
50
}
51
static public void Thread(ref BTNode T)
52
{
53
if (T != null)
54
{
55
if (T.lchild == null) { T.lchild = pre; T.ltag = 0; }
56
else { T.ltag = 1; }
57
if (T.rchild == null) { T.rtag = 0; }
58
else { T.rtag = 1; }
59
if (pre.rchild == null && pre.rtag == 0) pre.rchild = T;
60
pre = T;
61
if (T.ltag == 1) Thread(ref T.lchild);
62
if (T.rtag == 1) Thread(ref T.rchild);
63
}
64
}
65
/// <summary>
66
/// 先序输出:
67
/// </summary>
68
static public void PrePrint(BTNode T)
69
{
70
if (T != null)
71
{
72
Console.Write(T.data + "\t");
73
if (T.ltag == 1) PrePrint(T.lchild);
74
if (T.rtag == 1) PrePrint(T.rchild);
75
}
76
}
77
/// <summary>
78
/// 先序线索遍历输出:
79
/// </summary>
80
static public void PreThrPrint(BTNode T)
81
{
82
T = H.rchild;
83
//Console.WriteLine("H.rchild.date::"+H.rchild.data);
84
while (T != null)
85
{
86
Console.Write(T.data + "\t");
87
if (T.rtag == 0) T = T.rchild;
88
else
89
{
90
if (T.ltag == 1) T = T.lchild;
91
else
92
{
93
T = T.rchild;
94
}
95
}
96
}
97
}
98
/// <summary>
99
/// Deepth of a BiThrTree:
100
/// </summary>
101
static public int Deepth(BTNode T)
102
{
103
int a, b;
104
if (T != null)
105
{
106
if (T.ltag == 1) a = Deepth(T.lchild); else a = 0;
107
if (T.rtag == 1) b = Deepth(T.rchild); else b = 0;
108
return (1 + max(a, b));
109
}
110
else
111
{
112
return 0;
113
}
114
}
115
static public int max(params int[] w)
116
{
117
int max;
118
max = w[0];
119
for (int i = 0; i < w.Length; i++)
120
if (max < w[i]) max = w[i];
121
return max;
122
}
123
/// <summary>
124
/// 复制线索二叉树:
125
/// </summary>
126
static public void DulplicateBiThrTree(BTNode T1, ref BTNode T2)
127
{
128
if (T1 != null)
129
{
130
T2 = new BTNode();
131
T2.data = T1.data;
132
T2.ltag = T1.ltag; T2.rtag = T1.rtag;
133
if (T2.ltag == 1) DulplicateBiThrTree(T1.lchild, ref T2.lchild); else T2.lchild = T1.lchild;
134
if (T2.rtag == 1) DulplicateBiThrTree(T1.rchild, ref T2.rchild); else T2.rchild = T1.rchild;
135
}
136
}
137
138
static void Main()
139
{
140
BTNode mytree = null;
141
Console.WriteLine("Please input a tree(for example:abc##d##ed###):");
142
CreateBiThrTree(ref mytree);
143
Threading(ref mytree);
144
PrePrint(mytree);
145
Console.WriteLine("\n按先序输出:\n");
146
PreThrPrint(mytree);
147
Console.WriteLine("\n该树的深度为:{0}", Deepth(mytree));
148
BTNode mytree2 = null;
149
Console.WriteLine("调用复制函数得到的新树为:");
150
DulplicateBiThrTree(mytree, ref mytree2);
151
PrePrint(mytree2);
152
Console.ReadLine();
153
Console.ReadLine();
154
}
155
156
}
157
158
}
using System;2

3
namespace BiThrTree4
{5
/// <summary>6
/// 定义结点类:7
/// </summary>8
class BTNode9
{10
//先序:先处理父结点,然后递归处理孩子11
//中序:先处理左孩子,再处理根节结,然后递归处理右孩子12
//后序:先递归处理所有孩子,再递归处理节点本点13
public char data;14
public int ltag, rtag;//0表示线索,1表示结点15
public BTNode lchild, rchild;16
}17
class BiThrTree18
{19
/// <summary>20
/// 建立一棵新二叉树:21
/// </summary>22
/// <param name="T"></param>23
static public void CreateBiThrTree(ref BTNode T)24
{25
char ch;26
ch = (char)Console.Read();27
if (ch == '#')28
{29
T = null;30
}31
else32
{33
T = new BTNode();34
T.data = ch;35
CreateBiThrTree(ref T.lchild);36
CreateBiThrTree(ref T.rchild);37
}38
}39
/// <summary>40
/// 线索化二叉树:41
/// </summary>42
/// <param name="T"></param>43
static BTNode pre, H;44
static public void Threading(ref BTNode T)45
{46
H = pre = new BTNode();47
pre.rchild = pre.lchild = null;48
pre.rtag = pre.ltag = 0;49
Thread(ref T);50
}51
static public void Thread(ref BTNode T)52
{53
if (T != null)54
{55
if (T.lchild == null) { T.lchild = pre; T.ltag = 0; }56
else { T.ltag = 1; }57
if (T.rchild == null) { T.rtag = 0; }58
else { T.rtag = 1; }59
if (pre.rchild == null && pre.rtag == 0) pre.rchild = T;60
pre = T;61
if (T.ltag == 1) Thread(ref T.lchild);62
if (T.rtag == 1) Thread(ref T.rchild);63
}64
}65
/// <summary>66
/// 先序输出:67
/// </summary>68
static public void PrePrint(BTNode T)69
{70
if (T != null)71
{72
Console.Write(T.data + "\t");73
if (T.ltag == 1) PrePrint(T.lchild);74
if (T.rtag == 1) PrePrint(T.rchild);75
}76
}77
/// <summary>78
/// 先序线索遍历输出:79
/// </summary>80
static public void PreThrPrint(BTNode T)81
{82
T = H.rchild;83
//Console.WriteLine("H.rchild.date::"+H.rchild.data);84
while (T != null)85
{86
Console.Write(T.data + "\t");87
if (T.rtag == 0) T = T.rchild;88
else89
{90
if (T.ltag == 1) T = T.lchild;91
else92
{93
T = T.rchild;94
}95
}96
}97
}98
/// <summary>99
/// Deepth of a BiThrTree:100
/// </summary>101
static public int Deepth(BTNode T)102
{103
int a, b;104
if (T != null)105
{106
if (T.ltag == 1) a = Deepth(T.lchild); else a = 0;107
if (T.rtag == 1) b = Deepth(T.rchild); else b = 0;108
return (1 + max(a, b));109
}110
else111
{112
return 0;113
}114
}115
static public int max(params int[] w)116
{117
int max;118
max = w[0];119
for (int i = 0; i < w.Length; i++)120
if (max < w[i]) max = w[i];121
return max;122
}123
/// <summary>124
/// 复制线索二叉树:125
/// </summary>126
static public void DulplicateBiThrTree(BTNode T1, ref BTNode T2)127
{128
if (T1 != null)129
{130
T2 = new BTNode();131
T2.data = T1.data;132
T2.ltag = T1.ltag; T2.rtag = T1.rtag;133
if (T2.ltag == 1) DulplicateBiThrTree(T1.lchild, ref T2.lchild); else T2.lchild = T1.lchild;134
if (T2.rtag == 1) DulplicateBiThrTree(T1.rchild, ref T2.rchild); else T2.rchild = T1.rchild;135
}136
}137

138
static void Main()139
{140
BTNode mytree = null;141
Console.WriteLine("Please input a tree(for example:abc##d##ed###):");142
CreateBiThrTree(ref mytree);143
Threading(ref mytree);144
PrePrint(mytree);145
Console.WriteLine("\n按先序输出:\n");146
PreThrPrint(mytree);147
Console.WriteLine("\n该树的深度为:{0}", Deepth(mytree));148
BTNode mytree2 = null;149
Console.WriteLine("调用复制函数得到的新树为:");150
DulplicateBiThrTree(mytree, ref mytree2);151
PrePrint(mytree2);152
Console.ReadLine();153
Console.ReadLine();154
}155

156
}157

158
}


浙公网安备 33010602011771号