高度优先左高树与堆的性质类似,都可有作为优先级队列的底层结构。但应用高度优先左高树可以很容易的实现两个优先级队列的合并操作。
1
//高度优先左高树(HBLT)实现
2
#ifndef HBLT_H
3
#define HBLT_H
4
#include <queue>
5
//定义HBLT节点结构
6
template<class T>
7
class HBLTNode
8

{
9
10
public:
11
HBLTNode(T &e,int s)
12

{
13
data=e;
14
sh=s;
15
RightChild=LeftChild=NULL;
16
}
17
18
public:
19
T data;
20
int sh;//高度因子
21
HBLTNode<T> *RightChild,*LeftChild;
22
};
23
24
//定义HBLT树结构
25
template<class T>
26
class HBLT
27

{
28
public:
29
HBLT()
{size=0,root=NULL;}
30
virtual ~HBLT();
31
HBLT<T>& Insert(T e);//插入新元素
32
HBLT<T>& DeleteMax(T &e);//删除并返回最大元素
33
HBLT<T>& Meld(HBLT<T>& x);
34
bool IsEmpty()
{return root==NULL?true:false;}
35
void Initialize(T a[],int n);//对HBLT树重新初始化
36
int Size()
{return size;}
37
private:
38
39
HBLTNode<T> *root;//根节点指针
40
int size;
41
void Meld(HBLTNode<T>*&x,HBLTNode<T>*y);//将以x,y为根的两棵HBLT树合并
42
void PostVisit(HBLTNode<T> *root);//对树进行后序遍历删除节点
43
44
};
45
46
47
template<class T>
48
HBLT<T>::~HBLT()
49

{
50
PostVisit(root);
51
}
52
//----------------------------------------------------------
53
template<class T>
54
void HBLT<T>::Meld(HBLTNode<T>*&x,HBLTNode<T>*y)
55

{
56
if(!y)//y为空树
57
return;
58
if(!x)//x为空树
59

{
60
x=y;
61
return;
62
}
63
64
if(x->data<y->data) swap(x,y);//保证x指向大值
65
66
//递归合并x的右子树与y
67
Meld(x->RightChild,y);
68
69
if(!x->LeftChild)//如果X的左子树为空则将右子树移向左边
70

{
71
x->LeftChild=x->RightChild;
72
x->RightChild=NULL;
73
}
74
else
75

{
76
if(x->LeftChild->sh<x->RightChild->sh)//左子树没有右子树高
77

{
78
swap(x->LeftChild,x->RightChild);
79
x->sh=x->RightChild->sh+1;
80
}
81
}//if
82
83
}
84
//-------------------------------------------------------------
85
template<class T>
86
HBLT<T>& HBLT<T>::Insert(T e)
87

{
88
HBLTNode<T> *NewNode=new HBLTNode<T>(e,1);
89
Meld(root,NewNode);
90
size++;
91
return *this;
92
}
93
94
//-------------------------------------------------------------
95
template<class T>
96
HBLT<T>& HBLT<T>::DeleteMax(T &e)
97

{
98
99
e=root->data;
100
HBLTNode<T> *Left=root->LeftChild;
101
HBLTNode<T> *Right=root->RightChild;
102
root=Left;
103
Meld(root,Right);
104
--size;
105
return *this;
106
}
107
108
//-------------------------------------------------------------
109
template<class T>
110
HBLT<T>& HBLT<T>::Meld(HBLT<T>& x)
111

{
112
Meld(root,x.root);
113
x.root=NULL;
114
size=size+x.size;
115
return *this;
116
}
117
//-------------------------------------------------------------
118
template<class T>
119
void HBLT<T>::PostVisit(HBLTNode<T> *root)
120

{
121
if(root)
122

{
123
PostVisit(root->LeftChild);
124
PostVisit(root->RightChild);
125
delete root;
126
}
127
}
128
//-------------------------------------------------------------
129
template<class T>
130
void HBLT<T>::Initialize(T a[],int n)
131

{
132
if(root)
133
PostVisit(root);//删除以前的节点
134
size=n;
135
queue<HBLTNode<T>* > Q;
136
for(int i=0;i<n;i++)
137

{
138
HBLTNode<T> *NewNode=new HBLTNode<T>(a[i],1);
139
Q.push(NewNode);
140
}
141
142
for(i=1;i<=n-1;i++)
143

{
144
HBLTNode<T> *Node1 = Q.front();Q.pop();
145
HBLTNode<T> *Node2 = Q.front();Q.pop();
146
Meld(Node1,Node2);
147
Q.push(Node1);
148
}
149
150
root = Q.front();
151
}
152
#endif
posted on 2008-09-18 17:27
杨彬彬 阅读(1548)
评论(0) 编辑 收藏 引用