左傾堆的C 實現

2021-09-10 12:28:23 字數 2897 閱讀 7415

在下小白乙個 如有錯誤請指正

上**using system;

//資料結構

namespace datastructure

public leftistnoderightnode

public t key

public int npl

public leftistnode(leftistnodeleftnode, leftistnoderightnode, t key)

}///

/// 左傾堆 適用於: 最值問題、模擬問題、貪心問題

///

/// 包含父節點 左子節點 右子節點 鍵值 和 零距離

/// 零距離:從乙個節點到乙個最近的不滿節點的長度 不滿節點是指該節點的左右子節點 最少有乙個位空  不滿節點的零距離為0 空節點的0距離為-1

/// 左傾堆的基本性質

/// 1.節點的鍵值小於或者等於他的左右節點的鍵值

/// 2.左節點的零距離大於右節點的零距離

/// 3.節點的零距離等於他有孩子的零距離加1

public class leftistheapwhere t : icomparable

///

/// 外部 插入

///

///

public void inset(t key)

///

/// 內部 插入

///

///

private void inset(leftistnodeinsetnode)

///

/// 刪除外部

///

///

public void remove(t key)

///

/// 刪除

///

///

private void remove(leftistnoderemovenode)

else

newrootnode.rightnode = mergeleftistheap(newrootnode.rightnode, bigrootnode);

if (newrootnode.leftnode == null || newrootnode.leftnode.npl < newrootnode.rightnode.npl)

if (newrootnode.leftnode == null || newrootnode.rightnode == null)

newrootnode.npl = 0;

else

newrootnode.npl = newrootnode.leftnode.npl > newrootnode.rightnode.npl

? newrootnode.leftnode.npl + 1

: newrootnode.rightnode.npl + 1;

return newrootnode;

}///

/// 合併

///

///

public void mergeleftistheap(leftistheapotherheap)

///

/// 交換值

///

///

///

public void changekey(leftistnodenode, leftistnodeothernode)

///

/// 前序遍歷

///

///

void preorderleftist(leftistnoderoot)

///

/// 前序遍歷

///

public void preorderleftist()

///

/// 中序遍歷

///

///

void inorderleftist(leftistnodeheap)

///

/// 中序遍歷

///

public void inorderleftist()

///

/// 後序遍歷

///

///

void postorderleftist(leftistnodeheap)

///

/// 後序遍歷

///

public void postorderleftist()

///

/// 尋找最小值

/// 有返回1 沒有返回0

///

///

///

public int leftistminimum(leftistnodeheap, ref t minkey)

private void print(leftistnodenode, int direction)

key:    direction :", node.npl.tostring(), node.key.tostring(),

"root");

else if (direction == 0)

console.writeline("npl :   key:    direction :", node.npl.tostring(), node.key.tostring(),

"left");

else

console.writeline("npl :   key:    direction :", node.npl.tostring(), node.key.tostring(),

"right");

}private void print(leftistnoderoot)

if (root.rightnode != null)

}public void print()}}

左傾堆的實現

原理 實現 c 左傾堆,也被稱為左偏樹 左偏堆 最左堆等。與二叉堆一樣,它也是優先佇列實現的方法。當涉及到對兩個優先佇列的合併時,左傾堆的效率比二叉堆的效率高很多。template class t class node npl表示零距離長度 某結點到最近的不滿結點的路徑長度,不滿結點是指最多只有乙個...

紙上談兵 左傾堆 leftist heap

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

C 堆的實現

堆是乙個完全二叉樹。堆根據元素的排列方式,可以分為最大堆 max heap 和最小堆 min heap 其中 堆並不歸屬於stl庫容器元件,而是作為優先佇列 priority queue 的底層實現。堆是一種完全二叉樹,整棵二叉樹除了最底層的葉子節點之外是填滿的,而最底層的葉子節點由左至右是沒有空隙...