首先讓我們回顧一下完全二叉樹的兩個性質:
性質1:具有n個結點的完全二叉樹的深度為[logn](向下取整)+1。
性質2:
若對含
n 個結點的完全二叉樹從上到下且從左至右進行
1 至
n 的編號,則對完全二叉樹中任意乙個編號為
i 的結點:
(1) 若 i=1,則該結點是二叉樹的根,無雙親,否則,編號為 [i/2](向下取整)的結點為其雙親結點;
(2) 若 2i>n,則該結點無左孩子,否則,編號為 2i 的結點為其左孩子結點;
(3) 若 2i+1>n,則該結點無右孩子結點,否則,編號為2i+1 的結點為其右孩子結點。
從上圖可以看出, 如果完全二叉樹從上到下且從左至右進行從0至n-1進行編號,則對完全二叉樹的性質需要修改如下:
(1) 若 i=0,則該結點是二叉樹的根,無雙親,否則,編號為 [(i-1)/2](向下取整)的結點為其雙親結點;
(2) 若 2i+1>n,則該結點無左孩子,否則,編號為 2i+1 的結點為其左孩子結點;
(3) 若 2i+2>n,則該結點無右孩子結點,否則,編號為2i+2 的結點為其右孩子結點。
堆是滿足下列性質的數列:
(小頂堆)
(大頂堆)
大頂堆的設計
template class maxheap大頂堆的實現;
//構造堆頂元素template maxheap::maxheap(int _maxsize)
: maxsize(_maxsize),currentsize(0)
//析構
template maxheap::~maxheap()
//判空
template bool maxheap::isempty() const
//檢視堆頂元素插入元素template const type &maxheap::top() const
//插入template void maxheap::push(const type &item)
//將元素插入到堆的第乙個空位置上
heaparray[currentsize] = item;
//維護堆的性質:向上滲透
trickup(currentsize);
++ currentsize;
}
//向上滲透, 將剛剛插入的元素移動到合適的位置上template void maxheap::trickup(int index)
//插入
heaparray[index] = bottom;
}
//將堆的大小加倍刪除堆頂元素template void maxheap::resize()
delete heaparray;
heaparray = newheap;
maxsize = newsize;
}
//刪除template void maxheap::pop()
//顯示釋放堆頂元素
heaparray[0].~type();
//直接將最有乙個元素放到堆頂,
//並且currentsize-1
heaparray[0] = heaparray[-- currentsize];
//此時如果破壞了堆的性質:向下滲透
trickdown(0);
}
//向下滲透堆排序就是將元素乙個乙個插入到堆中, 然後再乙個乙個的取出來;template void maxheap::trickdown(int index)
//插入
heaparray[index] = top;
}
//堆排序附-測試**template void heapsort(type *begin, type *end)
}template void heapsort(type *array, int arraysize)
:
int main()heapsort(array, 20);
cout << endl;
for (int i = 0; i < 20; ++i)
cout << endl;
return 0;
}
資料結構基礎 19 堆與堆排序
首先讓我們回顧一下完全二叉樹的兩個性質 性質1 具有n個結點的完全二叉樹的深度為 logn 向下取整 1。性質2 若對含 n 個結點的完全二叉樹從上到下且從左至右進行 1 至 n 的編號,則對完全二叉樹中任意乙個編號為 i 的結點 1 若 i 1,則該結點是二叉樹的根,無雙親,否則,編號為 i 2 ...
資料結構 堆與堆排序
堆其實是從完全二叉樹演變過來的並且用來儲存資料的,什麼是完全二叉樹呢?完全二叉樹就是 若設二叉樹的深度為h,除第h層外,其它各層 1 h 1 的結點數都達到最大個數,第h層所有的結點都連續集中 在最左邊,這就是完全二叉樹。我們知道二叉樹可以用陣列模擬,堆自然也可以。現在讓我們來畫一棵完全二叉樹 從圖...
堆資料結構與堆排序
堆資料結構 堆 二叉堆 是近似的完全二叉樹,最底層允許不滿,堆的相關,陣列長度length,heap size有效長度 堆的有效元素,未排序的數目 heap size堆雖然很像二叉樹,但是我的理解就是用二叉樹的邏輯,但是最主要的區別在,堆的儲存是用陣列,只是用下標來幫助理解 堆的儲存結構 從上往下,...