資料結構與演算法之詳解二叉樹排序

2021-09-29 12:34:15 字數 2070 閱讀 8726

二叉樹(堆)的概念

二叉樹(堆)是一種結構:每個節點均可有兩個子節點,如此形成的一種倒立形樹形結構,而乙個陣列也能夠看成二叉樹,二叉樹的每乙個節點均看成陣列的乙個元素。

10

23 25

134 135 9

如圖示的二叉樹對應於陣列[10,23,25,134,135,9]。

如果堆的每乙個節點均比他的兩個子節點大,我們就稱這個二叉樹為最大堆。

如果對於乙個節點i,其的子樹均滿足最大堆性質,那麼我們將其與兩個子樹裡跟大的交換,就能是以i為節點的子堆成為最大堆了,以下是**:

/**

* 如果i節點下是最大堆,將包括i的子樹構建成最大堆

* * @param array

* @param i

* @param heapsize 二叉樹的有效長度

* @return

*/public static int maxheapify(int array, int i, int heapsize) else

if (r < heapsize && array[r] > array[large])

if (large != i)

return array;

}

如何講乙個普通的陣列生成為最大堆呢?

如下**可以做到:

/**

* 生成最大堆

* * @param array

* @return

*/public static int buildmaxherp(int array)

return array;

}

它在每一次迴圈後均能夠保證節點i,i+1,···,n是最大堆。

堆排序我們已經能夠將陣列在o(n)時間內轉換成最大堆,我們要將其排序。

第一步:將最大值,也就是根節點移出最大堆,將其與陣列最後的元素互換位置。這時,排在n位的就是陣列的最大值,而前面n-1個數不是最大堆了,因為根節點可能不滿足最大堆性質。

第三部,將前面n-1個數組成的最大堆的最大值與陣列次高位的數交換。

重複以上步驟,就能夠將陣列排序完成。

以下是完整**:

/**

* @author xuyu 二叉樹排序

*/public class binarytree ));

int array = ;

arrayutil.printarray(heapsort(array));

} /**

* 堆排序

* * @return

*/public static int heapsort(int array)

return array;

} /**

* 生成最大堆

* * @param array

* @return

*/public static int buildmaxherp(int array)

return array;

} /**

* 如果i節點下是最大堆,將包括i的子樹構建成最大堆

* * @param array

* @param i

* @param heapsize 二叉樹的有效長度

* @return

*/public static int maxheapify(int array, int i, int heapsize) else

if (r < heapsize && array[r] > array[large])

if (large != i)

return array;

} /**

* 左孩子的下標

* * @param i

* @return

*/public static int left(int i)

/*** 右孩子的下標

* * @param i

* @return

*/public static int right(int i)

}

演算法與資料結構 二叉樹

二叉樹 binary tree 二分樹 二元樹 二叉樹的遞迴定義 或是空樹,或是一棵由乙個根結點和左右子樹組成的樹,且左右子樹也是二叉樹。分枝結點 除葉結點以外的結點。二叉樹的性質 最多 2 h 1 個結點 n2 n0 1 滿二叉樹 所有分枝結點都存在左右子樹,且葉結點都在同一層。完全二叉樹 除最後...

資料結構與演算法 二叉樹

1.普通二叉樹 treenode package math public class treenode public void setdata int data public treenode getlchild public void setlchild treenode lchild publi...

資料結構與演算法 二叉樹

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 性質1 在二叉樹的第i層上至多有2 i 1 個結點 i 0 性質2 深度為k的二叉樹至多有2 k 1個結點 k 0 性質3 對於任意一棵二叉樹,如果其葉結點數為n0,而度...