左傾堆的實現

2021-10-04 04:05:55 字數 3868 閱讀 1271

原理**實現(c++)

左傾堆,也被稱為左偏樹、左偏堆、最左堆等。與二叉堆一樣,它也是優先佇列實現的方法。當涉及到對兩個優先佇列的合併時,左傾堆的效率比二叉堆的效率高很多。

template

<

class

t>

class

node

};

npl表示零距離長度:某結點到最近的不滿結點的路徑長度,不滿結點是指最多只有乙個孩子的結點。葉結點的npl=0,空結點的npl為-1。

//合併左傾堆x和左傾堆y 

template

<

class

t>

node

* leftistheap

::merge

(node

*&x,node

*&y)

//設定合併後的新樹的npl

if(x-

>r)

x->npl=x-

>r-

>npl+1;

else

x->npl=0;

return x;

}template

<

class

t>

void leftistheap

::merge

(leftistheap

*other)

//新增

template

<

class

t>

node

* leftistheap

::insert

(node

*&heap,t key)

template

<

class

t>

void leftistheap

::insert

(t key)

刪除操作只在根結點出進行

//刪除根結點

template

<

class

t>

node

* leftistheap

::remove

(node

*&heap)

template

<

class

t>

void leftistheap

::remove()

#include

#include

using

namespace std;

template

<

class

t>

class

node};

template

<

class

t>

class

leftistheap

;//建構函式

template

<

class

t>

leftistheap

::leftistheap()

//析構函式

template

<

class

t>

leftistheap::~

leftistheap()

//前序遍歷

template

<

class

t>

void leftistheap

::preorder

(node

*tree)

}template

<

class

t>

void leftistheap

::preorder()

//中序遍歷

template

<

class

t>

void leftistheap

::inorder

(node

*tree)

}template

<

class

t>

void leftistheap

::inorder()

//後序遍歷

template

<

class

t>

void leftistheap

::postorder

(node

*tree)

}template

<

class

t>

void leftistheap

::postorder()

//交換兩個結點的內容

template

<

class

t>

void leftistheap

::swapnode

(node

*&x,node

*&y)

//合併左傾堆x和左傾堆y

template

<

class

t>

node

* leftistheap

::merge

(node

*&x,node

*&y)

//設定合併後的新樹的npl

if(x-

>r)

x->npl=x-

>r-

>npl+1;

else

x->npl=0;

return x;

}template

<

class

t>

void leftistheap

::merge

(leftistheap

*other)

//新增

template

<

class

t>

node

* leftistheap

::insert

(node

*&heap,t key)

template

<

class

t>

void leftistheap

::insert

(t key)

//刪除根結點

template

<

class

t>

node

* leftistheap

::remove

(node

*&heap)

template

<

class

t>

void leftistheap

::remove()

//銷毀左傾堆

template

<

class

t>

void leftistheap

::destroy

(node

*&tree)

}template

<

class

t>

void leftistheap

::destroy()

template

<

class

t>

void leftistheap

::print

(node

*tree,t key,

int child)

}template

<

class

t>

void leftistheap

::print()

左傾堆的C 實現

在下小白乙個 如有錯誤請指正 上 using system 資料結構 namespace datastructure public leftistnoderightnode public t key public int npl public leftistnode leftistnodeleftn...

紙上談兵 左傾堆 leftist heap

我們之前講解了堆 heap 的概念。堆是乙個優先佇列。每次從堆中取出的元素都是堆中優先順序最高的元素。在之前的文章中,我們基於完全二叉樹 complete binary tree 實現了堆,這樣的堆叫做二叉堆 binary heap binary heap有乙個基本要求 每個節點的優先順序大於兩個子...

堆的基本實現

今天講棧,棧的基本操作是入棧和出棧,棧的特點是先進後出。同時在進棧的時候注意棧是否是滿的,出棧的時候注意棧是否是空的。直接上 棧的類實現 使用類模板來實現 template class stack template void stack print int index template bool s...