1. 程式人生 > >二叉排序樹和堆的區別

二叉排序樹和堆的區別

在二叉排序樹中,每個結點的值均大於其左子樹上所有結點的值,小於其右子樹上所有結點的值,對二叉排序樹進行中序遍歷得到一個有序序列。所以,二叉排序樹是結點之間滿足一定次序關係的二叉樹;

  堆是一個完全二叉樹,並且每個結點的值都大於或等於其左右孩子結點的值(這裡的討論以大根堆為例),所以,堆是結點之間滿足一定次序關係的完全二叉樹。

  具有n個結點的二叉排序樹,其深度取決於給定集合的初始排列順序,最好情況下其深度為log n(表示以2為底的對數),最壞情況下其深度為n;

  具有n個結點的堆,其深度即為堆所對應的完全二叉樹的深度log n 。

  在二叉排序樹中,某結點的右孩子結點的值一定大於該結點的左孩子結點的值;在堆中卻不一定,堆只是限定了某結點的值大於(或小於)其左右孩子結點的值,但沒有限定左右孩子結點之間的大小關係。

  在二叉排序樹中,最小值結點是最左下結點,其左指標為空;最大值結點是最右下結點,其右指標為空。在大根堆中,最小值結點位於某個葉子結點,而最大值結點是大根堆的堆頂(即根結點)。

  二叉排序樹是為了實現動態查詢而設計的資料結構,它是面向查詢操作的,在二叉排序樹中查詢一個結點的平均時間複雜度是O(log n);
  堆是為了實現排序而設計的一種資料結構,它不是面向查詢操作的,因而在堆中查詢一個結點需要進行遍歷,其平均時間複雜度是O(n)。