Dart實現二叉堆

2021-10-05 01:55:59 字數 1440 閱讀 5995

二叉堆是一種特殊的堆。具有如下的特性:

二叉堆分為兩類:

堆頂:二叉堆的根節.

在二叉堆這種結構中,對於刪除乙個節點,我們一般刪的是根節點

二叉樹一般是採用鍊錶的方式來實現的,但二叉堆我們是採用陣列的方式來儲存的

如果知道了乙個節點的位置,如何知道乙個節點的左右孩子節點的位置呢?

這其實不難,根據完全二叉樹的特點,假如乙個節點的下標為n,則可以求得它左孩子的下標為:2n+1;右孩子下標為:2n+2

//author:shawn

/* * 1

* / \

* 2 3

* / \ / \

* 5 4 6 7

* / \

* 8 9

* * array:[1,2,3,5,4,6,7,8,9]

* * leftchild : 2n + 1

* rightcgild : 2n + 2

*/list upadjust

(list arr,

int length)

arr[child]

= temp;

return arr;

}/**

* 下沉操作,執行刪除操作相當於把最後

* * 乙個元素賦給根元素之後,然後對根元素執行下沉操作

* @param arr

* @param parent 要下沉元素的下標

* @param length 陣列長度

*/list downadjust

(list arr,

int parent,

int length)

//如果父節點比孩子節點小或等於,則下沉結束

if(temp <= arr[child]

)break

;//單向賦值

arr[parent]

= arr[child]

; parent = child;

child =

2* parent +1;

} arr[parent]

= temp;

return arr;

}list buildhead

(list arr,

int length)

return arr;

}void

main()

執行結果:

[0, 3, 1, 5, 4, 6, 7, 8, 9]

二叉堆實現二

堆可以視為一棵完全二叉樹,樹的每一層都是被填滿的,最後一層可能除外,所以堆可以用陣列來表示。對於陣列中任意位置 i上的元素,其左兒子在位置 i 2 1 其右兒子在位置 i 2 2 上,其父節點在位置 i 1 2 1處。二叉堆有兩種 最大堆和最小堆。最大堆中,除根結點外 其無父結點 每個結點的關鍵字都...

二叉堆的實現

include include define max heap size 101 class binaryminheap void insert intvalue void removemin intgetmin void displayheaparray private int heaparray...

二叉堆的實現

1.堆的概念 這裡只需要注意兩點 a.堆的儲存方式 就是順序儲存在陣列中,在二叉樹中表現為滿二叉樹 b.堆的用處 用於排序,查詢最大最小都非常方便 2.堆的實現 heapexception.h ifndef heapexception h define heapexception h class a...