1
//實現二叉樹數據結構
2
#ifndef BINTREE_H
3
#define BINTREE_H
4
5
6
//定義節點結構
7
template<class T>
8
class BinTreeNode
9

{
10
public:
11
BinTreeNode(const T &e,BinTreeNode<T> *l=0,BinTreeNode<T> *r=0)
12
{
13
data=e;
14
LeftChild=l;
15
RightChild=r;
16
}
17
18
19
public:
20
T data;
21
BinTreeNode<T> *LeftChild,
22
*RightChild;
23
24
};
25
26
27
//定義BinTree數據結構
28
template<class E>//K關鍵子類型,E元素類型
29
class BinTree
30

{
31
public:
32
BinTree(BinTreeNode<E>*r=0)
{root=r;}
33
virtual ~BinTree();
34
35
//BinTree<K,E>& Insert(E &e);//插入新元素
36
//BinTree<K,E>& Delete(K &k);//根據關鍵字進行刪除
37
38
BinTree<E>& MeldTree(const E &e,BinTree<E>& left,BinTree<E>& right);//合并兩棵樹
39
void BreakTree(E &e,BinTree<E>& left,BinTree<E>& right);//拆開兩棵樹
40
41
void PreOrderVisit(void (*visit)(BinTreeNode<E> *node));//前序遍歷
42
void InOrderVisit(void (*visit)(BinTreeNode<E> *node));//中序遍歷
43
void PostOrderVisit(void (*visit)(BinTreeNode<E> *node));//后序遍歷
44
45
int Height()
{return height(root);};//返回樹的高度
46
47
48
protected:
49
50
void PreOrderVisit(BinTreeNode<E> *t,void (*visit)(BinTreeNode<E> *node));
51
void InOrderVisit(BinTreeNode<E> *t,void (*visit)(BinTreeNode<E> *node));
52
void PostOrderVisit(BinTreeNode<E> *t,void (*visit)(BinTreeNode<E> *node));
53
static void Free(BinTreeNode<E> *node)
{delete node;}
54
int height(BinTreeNode<E>*t);
55
int leaves(BinTreeNode<E>*t);
56
protected:
57
BinTreeNode<E> *root;//根節點指針
58
59
};
60
61
//---------------------------------------------------------------
62
template<class E>
63
BinTree<E>& BinTree<E>::MeldTree(const E &e,BinTree<E>& left,BinTree<E>& right)//合并兩棵樹
64

{
65
BinTreeNode<E> *NewNode=new BinTreeNode<E>(e,left.root,right.root);
66
root=NewNode;
67
left.root=right.root=0;
68
return *this;
69
}
70
71
//---------------------------------------------------------------
72
template<class E>
73
void BinTree<E>::BreakTree(E &e,BinTree<E>& left,BinTree<E>& right)
74

{
75
76
e=root->data;
77
left.root=root->LeftChild;
78
right.root=root->RightChild;
79
delete root;
80
root=0;
81
}
82
83
//---------------------------------------------------------------
84
template<class E>
85
void BinTree<E>::PreOrderVisit(void (*visit)(BinTreeNode<E> *node))
86

{
87
PreOrderVisit(root,visit);
88
}
89
//---------------------------------------------------------------
90
template<class E>
91
void BinTree<E>::InOrderVisit(void (*visit)(BinTreeNode<E> *node))
92

{
93
InOrderVisit(root,visit);
94
}
95
//---------------------------------------------------------------
96
template<class E>
97
void BinTree<E>::PostOrderVisit(void (*visit)(BinTreeNode<E> *node))
98

{
99
PostOrderVisit(root,visit);
100
}
101
//---------------------------------------------------------------
102
template<class E>
103
void BinTree<E>::PreOrderVisit(BinTreeNode<E> *t,void (*visit)(BinTreeNode<E> *node))
104

{
105
if(t)
106

{
107
visit(t);
108
PreOrderVisit(t->LeftChild,visit);
109
PreOrderVisit(t->RightChild,visit);
110
}
111
112
}
113
//---------------------------------------------------------------
114
template<class E>
115
void BinTree<E>::InOrderVisit(BinTreeNode<E> *t,void (*visit)(BinTreeNode<E> *node))
116

{
117
if(t)
118

{
119
InOrderVisit(t->LeftChild,visit);
120
visit(t);
121
InOrderVisit(t->RightChild,visit);
122
}
123
124
125
}
126
//---------------------------------------------------------------
127
template<class E>
128
void BinTree<E>::PostOrderVisit(BinTreeNode<E> *t,void (*visit)(BinTreeNode<E> *node))
129

{
130
if(t)
131

{
132
PostOrderVisit(t->LeftChild,visit);
133
PostOrderVisit(t->RightChild,visit);
134
visit(t);
135
}
136
}
137
//---------------------------------------------------------------
138
template<class E>
139
BinTree<E>::~BinTree()
140

{
141
PostOrderVisit(Free);
142
}
143
144
//---------------------------------------------------------------
145
template<class E>
146
int BinTree<E>::height(BinTreeNode<E>*t)
147

{
148
if(!t) return 0;
149
else
150

{
151
int hl=height(t->LeftChild);
152
int hr=height(t->RightChild);
153
154
if(hl>hr) return ++hl;
155
else return ++hr;
156
}
157
}
158
159
160
161
162
#endif

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
