PTA 04-树6 Complete Binary Search Tree

来源:互联网 发布:工业产品网络推广 编辑:程序博客网 时间:2024/06/13 23:24

先出给题把。

04-树6 Complete Binary Search Tree   (30分)

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 NN (\le 10001000). Then NN 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:

    101 2 3 4 5 6 7 8 9 0

    Sample Output:

    6 3 8 1 5 7 9 0 2 4


  • 这道题我自己做想了会,后来看了解答才AC的。感觉和那道Tree Traversal Again好相似啊。用数组表示,再递归小数组,最后给个返回条件返回。
    下面给出根据陈越老师讲的算法,AC了的代码。

    #include"stdio.h"#include"stdlib.h"#include"math.h"#define MAXSIZE 1000int T[MAXSIZE];int A[MAXSIZE];int flag=1;int GetLeftLength(int n){int L,X,result;double n1=n;result= log(n1+1)/log(2.0) ;X=n+1-pow(2.0,result);X=X<pow(2.0,result-1)?X:pow(2.0,result-1);return (pow(2.0,result-1)+X-1);}void solve(int ALeft,int ARight,int TRoot)  //ALeft在树数列中根节点下标,ARight是树最后一个叶节点下标,TRoot为得到的结果数列中,该树数列的根节点所在的下标{int n,L;//n代表数列中元素个数,L代表左子树的个数n=ARight-ALeft+1;if(!n)return;L=GetLeftLength(n);T[TRoot]=A[ALeft+L];//给结果树的目标位置放上元素solve(ALeft,ALeft+L-1,TRoot*2+1);//递归解决左子树数列solve(ALeft+L+1,ARight,TRoot*2+2);return;} int compare(const void* a,const void* b){return *(int*)a-*(int*)b;}int main(){int sum,i;scanf("%d",&sum);for(i=0;i<sum;i++)scanf("%d",&(A[i]));qsort(A,sum,sizeof(int),compare);solve(0,sum-1,0);for(i=0;i<sum;i++){if(flag==1)        {flag=0;printf("%d",T[i]);}elseprintf(" %d",T[i]);}system("pause");return 0;}
    忙碌的一天结束了!

    0 0
    原创粉丝点击