優先佇列之左式堆 JAVA實現

2021-08-02 17:46:41 字數 1724 閱讀 4348

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.二叉堆 優先佇列的實現普遍使用二叉堆,堆有兩個...