데이터 구조 트 리 예제 Complete Binary Search Tree

A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
The left subtree of a node contains only nodes with keys less than the node’s key. The right subtree of a node contains only nodes with keys greater than or equal to the node’s key. Both the left and right subtrees must also be binary search trees. A Complete Binary Tree (CBT) is a tree that is completely filled, with the possible exception of the bottom level, which is filled from left to right.
Now given a sequence of distinct non-negative integer keys, a unique BST can be constructed if it is required that the tree must also be a CBT. You are supposed to output the level order traversal sequence of this BST.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (≤1000). Then N distinct non-negative integer keys are given in the next line. All the numbers in a line are separated by a space and are no greater than 2000.
Output Specification:
For each test case, print in one line the level order traversal sequence of the corresponding complete binary search tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.
Sample Input:
10 1 2 3 4 5 6 7 8 9 0 Sample Output:
6 3 8 1 5 7 9 0 2 4
#include 
#include 
#include 

int compare(const void* a, const void* b);
void Solve(int A[], int T[], int ALeft, int ARight, int TRoot);
int GetLeftLength(int n);

int main()
{
    int N, IsLegal = 0;//N     
    int* A, *T;//        ,                        
    int i;

    QQ: ;
    IsLegal = scanf("%d", &N);
    if(N < 0 || N > 1000 || IsLegal != 1){
        printf("N      \t     
"
); goto QQ; } T = (int*)malloc(N * sizeof(int)); A = (int*)malloc(N * sizeof(int)); if(A == NULL){ printf(" A
"
); exit(1); }else if(T == NULL){ printf(" T
"
); exit(1); } for(i = 0; i < N; i++){ scanf("%d", &A[i]); } qsort(A, N, sizeof(int), compare);// Solve(A, T, 0, N - 1, 0); for(i = 0; i < N - 1; i++){ printf("%d ", T[i]); } printf("%d
"
, T[N - 1]); free(A); free(T); return 0; } int compare(const void* a, const void* b) { return *(int*)a - *(int*)b; } void Solve(int A[], int T[], int ALeft, int ARight, int TRoot) {// T, , int n, L, LeftRoot, RightRoot; n = ARight - ALeft + 1; if(n == 0) return;// L = GetLeftLength(n);// n , T[TRoot] = A[ALeft + L];// , T LeftRoot = TRoot * 2 + 1;// T RightRoot = LeftRoot + 1;// T Solve(A, T, ALeft, ALeft + L -1, LeftRoot); Solve(A, T, ALeft + L + 1, ARight, RightRoot); } int GetLeftLength(int n) { int H, x1, x2, x, L; H = floor((log10(n + 1)) / log10(2)); x1 = n + 1 - pow(2, H); x2 = pow(2, H - 1); if(x1 < x2){ x = x1; }else{ x = x2; } L = x2 - 1 + x; return L; }

좋은 웹페이지 즐겨찾기