1.零路徑長度:某節點的零路徑長度為該節點到沒有兩個兒子的節點最短距離。
2.左式堆性質:
1.合併:
左式堆的合併操作基於遞迴實現,演算法思路如下:
若有一棵樹是空樹,則返回另一棵樹;否則將根節點較大的堆與根節點較小的堆的右子樹合併。
使形成的新堆作為較小堆的右子樹。
如果違反了左式堆的特性,交換兩個子樹的位置。
更新npl(零路徑長度)。
2.插入
將需要插入的節點當做一棵左式堆樹,進行合併。
3.刪除最小值
刪除根節點,將形成的兩個堆合併
public class
leftistheap
extends
comparable>
node(t element, nodeleft, noderight)
}private noderoot;
/*** 構造方法
*/public leftistheap()
/*** 合併堆
** @param rhs 另乙個左式堆
*/public void merge(leftistheaprhs)
root = merge(root, rhs.root);
rhs.root = null;
}public void insert(t x)
/*** 找出最小元素
** @return
*/public t findmin()
return root.element;
}/**
* 刪除最小元素
** @return
*/public t deletemin()
t minelement = root.element;
root=merge(root.left, root.right);
return minelement;
}/**
* 是否為空
** @return
*/public boolean isempty()
/*** 置空
*/public void makeempty()
/*** 合併兩個左式堆(判斷過程,真正合併過程由merge1操作)
** @param h1
* @param h2
* @return
*/private nodemerge(nodeh1, nodeh2)
/*** 合併兩個左式堆的真正操作 h1的元素小於h2(即h2與h1的右子堆合併)
** @param h1
* @param h2
* @return
*/private nodemerge1(nodeh1, nodeh2) else
h1.npl = h1.right.npl + 1;//零路徑長為右兒子的零路徑長+1
}return h1;
}/**
* 交換左右兒子
** @param t
* @return
*/private void swapchildren(nodet)
private void print(node t)
public static void main(string args)
}
用堆實現優先佇列
堆的性質 1.乙個是他是乙個陣列 當然你也可以真的用鍊錶來做。2.他可以看做乙個完全二叉樹。注意是完全二叉樹。所以他的葉子個數剛好是nsize 2個。3.我使用的下標從1開始,這樣好算,如果節點的位置為i,他的父節點就是i 2,他的左孩子結點就是i 2,右孩子結點就是i 2 1,如果下標從0開始,要...
用堆實現優先佇列
話不多說,先上 include include 定義乙個堆得結構體,struct myheap 調整資料,維持堆得性質,這個和上次heapify的作用一樣 只是這個時從子道父節點這樣的判斷而已。int increasekey myheap pheap,int npos else 否則堆沒有被破壞,退...
優先佇列《堆》
1.模型 兩個基本操作 insert等價enqueue deletemin刪除最小者 dequeue 2.簡單的實現 1 簡單鍊錶 遍歷刪除min或者排序刪除min 2 使用二叉查詢樹。反覆除去min會使得樹不平衡,並且bst還支援許多不需要的操作。3.二叉堆 優先佇列的實現普遍使用二叉堆,堆有兩個...