優先隊列入隊操作

2021-09-26 16:26:14 字數 2148 閱讀 1003

效果展示:

這裡我們從陣列的一號位置開始儲存

那麼在二叉樹中的規律是

如上圖所示,我們發現,連線的間隔越是往後,距離就越大,而且正好是2的倍數,間隔呈現2,4,8那樣增長

由於parent(i) = i/2,如上圖所示, 15位置是 10 ,那麼他的父親節點位置是 5,也就是41,41的位置是5,那麼他父親節點的位置是2,(這裡我沒有寫 0號元素),也就是52

我們會發現,每一次找父節點都是 當前節點的位置除以2,也就是相當於折半查詢。我們知道

2的19次方524 288,也就是說第524288位元素,他最多有19個祖宗,也就是說只要查詢19次,就跳到了陣列的頭部

維持這個大根堆,我們使用shiftup操作,i節點第(i/2)位節點(他爸爸)比較,如果i比 他父親

要大,就互換,維持大的在上面,小的在下面的結構,這裡就有點像氣泡排序那樣的交換排序,只要大就交換,不過冒泡是大的放後面

注意:這裡描述的是優先佇列的入隊操作入隊使用 shiftup,出隊使用shiftdown,只要在末尾新增乙個元素,就對這最後乙個元素執行shiftup操作

public class main 

}public void treeprint()

system.out.println("the max heap size is: " + size());

system.out.println("data in the max heap: ");

for (int i = 0; i < size(); i++)

system.out.println();

system.out.println();

int n = size();

int maxlevel = 0;

int numberperlevel = 1;

while (n > 0)

int maxlevelnumber = (int) math.pow(2, maxlevel - 1);

int curtreemaxlevelnumber = maxlevelnumber;

int index = 1;

for (int level = 0; level < maxlevel; level++)

system.out.println(line1);

if (level == maxlevel - 1)

string line2 = new string(new char[maxlevelnumber * 3 - 1]).replace('\0', ' ');

for (int indexcurlevel = 0; indexcurlevel < curlevelnumber; indexcurlevel++)

system.out.println(line2);

curtreemaxlevelnumber /= 2;}}

private string putnumberinline(integer num, string line, int indexcurlevel, int curtreewidth, boolean isleft) else else

}return line;

}private string putbranchinline(string line, int indexcurlevel, int curtreewidth)

}

鏈佇列 入隊出隊

include include typedef struct lnode int data struct lnode next linklist typedef struct linklist front linklist rear linkqueue int inqueue linkqueue l...

佇列的入隊 出隊操作

程式設計實現佇列的入隊 出隊操作 先進先出 include using namespace std node表示佇列中每個節點元素 typedef struct node node queue表示佇列 typedef struct queue queue 建立空佇列 queue createqueu...

python 兩個棧實現隊列入隊出隊功能

佇列特點 先進先出,一端進一端出 棧特點 先進後出,只從尾部出 思路 棧1彈棧 讓資料結構變成 300,200,100 class solution def init self 建立2個棧空間 self.stack a self.stack b defpush self,value 入佇列 在sta...