1. 程式人生 > >資料結構-圖-C語言-PTA-Complete Binary Search Tree

資料結構-圖-C語言-PTA-Complete Binary Search Tree

Data Structures and Algorithms (English)

7-7 Complete Binary Search Tree

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define Max 1000

int A[Max];
int T[Max];

int comp(const void*a, const void*b)//用來做比較的函式。
{
	return *(int*)a - *(int*)b;
}

/*
*@program 獲得左子樹的規模(利用完全二叉樹的特性)
*@param n 母樹的規模
*/
int getALeftLength(int n) { int depth = floor(log(n+1) / log(2));//母樹的深度 int x = n + 1 - pow(2, depth); x = (x < pow(2, depth - 1)) ? x : pow(2, depth - 1); return x + pow(2, depth-1)-1; } /* *@program 核心演算法 *@param ALeft 當前樹最左端的下標 *@param ARight 當前樹最右端的下標 *@param TRoot 樹T根節點的下標 */ void solve(int
ALeft, int ARight, int TRoot) { int n = ARight - ALeft + 1;//為當前樹的規模 if (n == 0) return; int leftLength = getALeftLength(n); T[TRoot] = A[ALeft + leftLength]; int TLeftRoot = TRoot * 2 + 1; int TRightRoot = TLeftRoot + 1; solve(ALeft, ALeft + leftLength - 1, TLeftRoot); solve(ALeft + leftLength +
1, ARight, TRightRoot); } int main() { int n, number; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &number); A[i] = number; } qsort(A, n, sizeof(int), comp); solve(0, n - 1, 0); for (int i = 0; i < n; i++) { printf("%d", T[i]); if (i != n - 1) { printf(" "); } } }