在下小白乙個 如有錯誤請指正
上**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 的底層實現。堆是一種完全二叉樹,整棵二叉樹除了最底層的葉子節點之外是填滿的,而最底層的葉子節點由左至右是沒有空隙...