二叉堆是完全二元樹或者是近似完全二元樹,按照資料的排列方式可以分為兩種:最大堆和最小堆。
最大堆:父結點的鍵值總是大於或等於任何乙個子節點的鍵值;最小堆:父結點的鍵值總是小於或等於任何乙個子節點的鍵值。示意圖如下:
二叉堆一般都通過"陣列"來實現。陣列實現的二叉堆,父節點和子節點的位置存在一定的關係。
索引為i的左孩子的索引是 (2*i+1);
索引為i的左孩子的索引是 (2*i+2);
索引為i的父結點的索引是 floor((i-1)/2);
假設在最大堆[90,80,70,60,40,30,20,10,50]種新增85,需要執行的步驟如下:
如上圖所示,當向最大堆中新增資料時:先將資料加入到最大堆的最後,然後盡可能把這個元素往上挪,直到挪不動為止!
將85新增到[90,80,70,60,40,30,20,10,50]中後,最大堆變成了[90,85,70,60,80,30,20,10,50,40]。
假設從最大堆[90,85,70,60,80,30,20,10,50,40]中刪除90,需要執行的步驟如下:
如上圖所示,當從最大堆中刪除資料時:先刪除該資料,然後用最大堆中最後乙個的元素插入這個空位;接著,把這個「空位」盡量往下挪,直到剩餘的資料變成乙個最大堆。
從[90,85,70,60,80,30,20,10,50,40]刪除90之後,最大堆變成了[85,80,70,60,40,30,20,10,50]。
注意:考慮從最大堆[90,85,70,60,80,30,20,10,50,40]中刪除60,執行的步驟不能單純的用它的字節點來替換;而必須考慮到"替換後的樹仍然要是最大堆"!
msize++; //先插入調整後,當前大小再加1
}templatevoid maxheap::filterdown(int start, int end)
mheap[cur] = mheap[lch];
cur = lch;
lch = 2 * cur + 1;
} mheap[cur] = tmp;
}templatevoid maxheap::remove(t &data)
int index = getindex(data);
if (-1 == index)
mheap[index] = mheap[--msize];
filterdown(index, msize); //先減小大小,再向下調整
}templateint maxheap::getindex(t &data)
return -1;
}templatevoid maxheap::print()
; int i, len = (sizeof(a)) / (sizeof(a[0]));
maxheap* tree = new maxheap();
cout << "== 依次新增: ";
for (i = 0; iinsert(a[i]);
} cout << "\n== 最 大 堆: ";
tree->print();
i = 85;
tree->insert(i);
cout << "\n== 新增元素: " << i;
cout << "\n== 最 大 堆: ";
tree->print();
i = 90;
tree->remove(i);
cout << "\n== 刪除元素: " << i;
cout << "\n== 最 大 堆: ";
tree->print();
cout << endl;
delete tree;
}
二叉堆 最大堆實現
include include include include include include using namespace std template typename item class maxheap void shiftdown int k public 建構函式,構造乙個空堆,可容納ca...
二叉堆的實現
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...