您的位置:首页 > 编程语言 > C语言/C++

左倾堆(二)之 C++的实现

2014-04-09 08:50 2211 查看

概要

上一章介绍了左倾堆的基本概念,并通过C语言实现了左倾堆。本章是左倾堆的C++实现。

目录
1. 左倾堆的介绍
2. 左倾堆的图文解析
3. 左倾堆的C++实现(完整源码)
4. 左倾堆的C++测试程序

转载请注明出处:https://www.geek-share.com/detail/2608004600.html

更多内容:数据结构与算法系列 目录

(01) 左倾堆(一)之 图文解析 和 C语言的实现
(02) 左倾堆(二)之 C++的实现
(03) 左倾堆(三)之 Java的实现

左倾堆的介绍

左倾堆(leftist tree 或 leftist heap),又被成为左偏树、左偏堆,最左堆等。
它和二叉堆一样,都是优先队列实现方式。当优先队列中涉及到"对两个优先队列进行合并"的问题时,二叉堆的效率就无法令人满意了,而本文介绍的左倾堆,则可以很好地解决这类问题。

左倾堆的定义

/**
* C 语言: 左倾堆
*
* @author skywang
* @date 2013/11/07
*/

#include <iostream>
#include "LeftistHeap.h"
using namespace std;

int main()
{
int i;
int a[]= {10,40,24,30,36,20,12,16};
int b[]= {17,13,11,15,19,21,23};
int alen=sizeof(a)/sizeof(a[0]);
int blen=sizeof(b)/sizeof(b[0]);
LeftistHeap<int>* ha=new LeftistHeap<int>();
LeftistHeap<int>* hb=new LeftistHeap<int>();

cout << "== 左倾堆(ha)中依次添加: ";
for(i=0; i<alen; i++)
{
cout << a[i] <<" ";
ha->insert(a[i]);
}
cout << "\n== 左倾堆(ha)的详细信息: " << endl;
ha->print();

cout << "\n== 左倾堆(hb)中依次添加: ";
for(i=0; i<blen; i++)
{
cout << b[i] <<" ";
hb->insert(b[i]);
}
cout << "\n== 左倾堆(hb)的详细信息: " << endl;
hb->print();

// 将"左倾堆hb"合并到"左倾堆ha"中。
ha->merge(hb);
cout << "\n== 合并ha和hb后的详细信息: " << endl;
ha->print();

// 销毁
ha->destroy();

return 0;
}


View Code

左倾堆的C++测试程序

左倾堆的测试程序已经包含在它的实现文件(LeftistHeapTest.cpp)中了,这里仅给出它的运行结果:

== 左倾堆(ha)中依次添加: 10 40 24 30 36 20 12 16
== 左倾堆(ha)的详细信息:
10(2) is root
24(1) is 10's   left child
30(0) is 24's   left child
36(0) is 24's  right child
12(1) is 10's  right child
20(0) is 12's   left child
40(0) is 20's   left child
16(0) is 12's  right child

== 左倾堆(hb)中依次添加: 17 13 11 15 19 21 23
== 左倾堆(hb)的详细信息:
11(2) is root
15(1) is 11's   left child
19(0) is 15's   left child
21(0) is 15's  right child
13(1) is 11's  right child
17(0) is 13's   left child
23(0) is 13's  right child

== 合并ha和hb后的详细信息:
10(2) is root
11(2) is 10's   left child
15(1) is 11's   left child
19(0) is 15's   left child
21(0) is 15's  right child
12(1) is 11's  right child
13(1) is 12's   left child
17(0) is 13's   left child
16(0) is 13's  right child
23(0) is 16's   left child
20(0) is 12's  right child
40(0) is 20's   left child
24(1) is 10's  right child
30(0) is 24's   left child
36(0) is 24's  right child
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: