高度优先左高树实现

高度优先左高树实现

高度优先左高树与堆的性质类似,都可有作为优先级队列的底层结构。但应用高度优先左高树可以很容易的实现两个优先级队列的合并操作。

  1 // 高度优先左高树(HBLT)实现
  2 #ifndef HBLT_H
  3 #define  HBLT_H
  4 #include  < queue >
  5 // 定义HBLT节点结构
  6 template < class  T >
  7 class  HBLTNode
  8 {
  9
 10public:
 11HBLTNode(T &e,int s)
 12{
 13data=e;
 14sh=s;
 15RightChild=LeftChild=NULL;
 16}

 17
 18public:
 19    T data;
 20    int sh;//高度因子
 21    HBLTNode<T> *RightChild,*LeftChild;
 22}
;
 23
 24 // 定义HBLT树结构
 25 template < class  T >
 26 class  HBLT
 27 {
 28public:
 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;}
 37private:
 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 {
 50PostVisit(root);
 51}

 52 // ----------------------------------------------------------
 53 template < class  T >
 54 void  HBLT < T > ::Meld(HBLTNode < T >*& x,HBLTNode < T >* y)
 55 {
 56if(!y)//y为空树
 57 return;
 58if(!x)//x为空树
 59{
 60x=y;
 61return;
 62}

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

 74else
 75{
 76if(x->LeftChild->sh<x->RightChild->sh)//左子树没有右子树高
 77{
 78swap(x->LeftChild,x->RightChild);
 79x->sh=x->RightChild->sh+1;
 80}

 81}
//if
 82
 83}

 84 // -------------------------------------------------------------
 85 template < class  T >
 86 HBLT < T >&  HBLT < T > ::Insert(T e)
 87 {
 88HBLTNode<T> *NewNode=new HBLTNode<T>(e,1);
 89Meld(root,NewNode);
 90size++;
 91return *this;
 92}

 93
 94 // -------------------------------------------------------------
 95 template < class  T >
 96 HBLT < T >&  HBLT < T > ::DeleteMax(T  & e)
 97 {
 98
 99e=root->data;
100HBLTNode<T> *Left=root->LeftChild;
101HBLTNode<T> *Right=root->RightChild;
102root=Left;
103Meld(root,Right);
104--size;
105return *this;
106}

107
108 // -------------------------------------------------------------
109 template < class  T >
110 HBLT < T >&  HBLT < T > ::Meld(HBLT < T >&  x)
111 {
112Meld(root,x.root);
113x.root=NULL;
114size=size+x.size;
115return *this;
116}

117 // -------------------------------------------------------------
118 template < class  T >
119 void  HBLT < T > ::PostVisit(HBLTNode < T >   * root)
120 {
121if(root)
122{
123PostVisit(root->LeftChild);
124PostVisit(root->RightChild);
125delete root;
126}

127}

128 // -------------------------------------------------------------
129 template < class  T >
130 void  HBLT < T > ::Initialize(T a[], int  n)
131 {
132if(root)
133  PostVisit(root);//删除以前的节点
134size=n;
135queue<HBLTNode<T>* > Q;
136for(int i=0;i<n;i++)
137{
138HBLTNode<T> *NewNode=new HBLTNode<T>(a[i],1);
139Q.push(NewNode);
140}

141
142for(i=1;i<=n-1;i++)
143{
144HBLTNode<T> *Node1 = Q.front();Q.pop();
145HBLTNode<T> *Node2 = Q.front();Q.pop();
146Meld(Node1,Node2);
147Q.push(Node1);
148}

149
150root = Q.front();
151}

152 #endif

你可能感兴趣的:(高度优先左高树实现)