数据结构中最欣欣向荣的两个分支就是:平衡树 和可合并堆,高级树结构的核心都是围绕如何使树到达平衡而展开,高级堆结构的核心就是如何有效地进行合并。左式堆由于使用二叉链表的存储结构,对动态操作支持良好,在需要合并操作的场合,是极佳的选择。
左式堆的性质:
1.【堆性质】:任意节点的关键字大于等于其孩子节点的关键字,为了让最小的结点始终在根的位置。
2.【左偏性质】:定义到最近的孩子的距离为节点距离dist,那么任意节点的左孩子的距离大于右孩子的距离,为了让树状存储的堆,树的深度不能过大,且利于合并,并且插入的时候总从较短的右子树插入。
A->lchild->dist >= A->rchild->dist
// zuoshidui.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> using namespace std; #ifndef _LefeHeap_H struct TreeNode; typedef struct TreeNode *PriorityQueue; PriorityQueue Initialize(void); int FindMin(PriorityQueue H); bool isEmpty(PriorityQueue H); PriorityQueue Merge(PriorityQueue H1, PriorityQueue H2); #define Insert(x,H) (H=Insert1((x),H)) PriorityQueue Insert1(int x, PriorityQueue H); PriorityQueue DeleteMin1(PriorityQueue H); #endif // !_LefeHeap_H struct TreeNode { int element; PriorityQueue Left; PriorityQueue Right; int Npl; }; void SwapChildren(PriorityQueue& H) { PriorityQueue temp = H->Left; H->Left = H->Right; H->Right = temp; } static PriorityQueue Merge1(PriorityQueue H1, PriorityQueue H2) { if (H1->Left == NULL) H1->Left = H2; else { H1->Right = Merge(H1->Right, H2); if (H1->Left->Npl < H1->Right->Npl) SwapChildren(H1); H1->Npl = H1->Right->Npl + 1; } return H1; } PriorityQueue Merge(PriorityQueue H1, PriorityQueue H2) //默认堆头较小的元素作为Merge1的第一个参数 { if (H1 == NULL) return H2; if (H2 == NULL) return H1; if (H1->element < H2->element) return Merge1(H1, H2); else return Merge1(H2, H1); } PriorityQueue Insert1(int x, PriorityQueue H) //把插入操作视为一个单节点和一个左式堆合并 { PriorityQueue SingleNode; SingleNode = (PriorityQueue)malloc(sizeof(TreeNode)); if (SingleNode == NULL) cout << "out of space"; else { SingleNode->element = x; SingleNode->Npl = 0; SingleNode->Left = SingleNode->Right = NULL; H = Merge(SingleNode, H); } return H; } bool isEmpty(PriorityQueue H) { if (H == NULL) return true; else return false; } PriorityQueue DeleteMin1(PriorityQueue H) { PriorityQueue LeftHeap, RightHeap; if (isEmpty(H)) { cout << "Priority queue is empty"; return H; } LeftHeap = H->Left; RightHeap = H->Right; free(H); return Merge(LeftHeap, RightHeap); } int main() { return 0; }