博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
左式堆
阅读量:6534 次
发布时间:2019-06-24

本文共 2170 字,大约阅读时间需要 7 分钟。

      数据结构中最欣欣向荣的两个分支就是:平衡树 和可合并堆,高级树结构的核心都是围绕如何使树到达平衡而展开,高级堆结构的核心就是如何有效地进行合并。左式堆由于使用二叉链表的存储结构,对动态操作支持良好,在需要合并操作的场合,是极佳的选择。

左式堆的性质:
1.【堆性质】:任意节点的关键字大于等于其孩子节点的关键字,为了让最小的结点始终在根的位置。
2.【左偏性质】:定义到最近的孩子的距离为节点距离dist,那么任意节点的左孩子的距离大于右孩子的距离,为了让树状存储的堆,树的深度不能过大,且利于合并,并且插入的时候总从较短的右子树插入。
A->lchild->dist >= A->rchild->dist
// zuoshidui.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include
using namespace std;#ifndef _LefeHeap_Hstruct 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_Hstruct 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;}

  

 

转载于:https://www.cnblogs.com/linear/p/6647036.html

你可能感兴趣的文章
WSFC2016 VM弹性与存储容错
查看>>
文档管理,文本编辑控件TX Text Control .NET for WPF
查看>>
复习 Python 匿名函数 内建函数
查看>>
Security Identifiers | Win SRV2016 SID Change 修改
查看>>
看看来自日本的扫描,做网站需要注意的
查看>>
JDK 1.7+Android SDK+IntelliJ IDEA 13+Genymotion 安卓开发环境部署
查看>>
钓鱼邮件***防范指南
查看>>
session_start()放置位置的不正确引发的ROOT常量 未定义的错误
查看>>
如何设定VDP同时备份的任务数?
查看>>
ipsec的***在企业网中的经典应用
查看>>
过来人谈《去360还是留在百度?》
查看>>
mysql备份工具innobackupex,xtrabackup-2.1安装,参数详解
查看>>
【复制】slave筛选复制之二(create/drop table语句)
查看>>
Movie Store OpenCart 自适应主题模板 ABC-0249
查看>>
RedHat linux YUM本地制作源
查看>>
apache端口占用问题
查看>>
本地Office Project计划表同步到SharePoint2013任务列表的权限问题
查看>>
Windows2008 R2 GAC权限问题
查看>>
洛谷——P1469 找筷子
查看>>
几句话就能让你明白:网络地址转换(NAT)
查看>>