二叉树实现(主要是为了实现二叉搜索树时作为其父类)
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
posted on 2008-09-18 17:14
杨彬彬 阅读(544)
评论(0) 编辑 收藏 引用 所属分类:
数据结构