데이터 구조 04 - 트 리 6 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
    #include
    #define MaxSize 2005
    using namespace std;
    int value[MaxSize];
    int BST[MaxSize];
    
    //    n              
    int getLeftTreeSize(int n){
    	int h =0;   //               
    	int tmp = n+1;
    	while(tmp!=1){
    		tmp /=2;
    		h++;
    	}
    	int x = n-pow(2,h)+1;   //             
    	x = x<pow(2,h-1)?x:pow(2,h-1);   //           2^(h-1) 
    	int L = pow(2,h-1)-1+x;   //                
    	return L;
    }
    
    //     
    void fill(int left,int right,int root){
    	int n = right - left + 1;  //           
     	if(!n)
     		return;
     	int L = getLeftTreeSize(n);   //   "   " 
     	BST[root] = value[left + L];    //               +     
     	int leftRoot = 2 * root + 1;   //        ,    0    
     	int rightRoot = leftRoot + 1;  //         
     	fill(left,left+L-1,leftRoot);  //       
     	fill(left+L+1,right,rightRoot);   //       
    }
    
    int main(){
    	int n;
    	cin>>n;
    	for(int i=0;i<n;i++){
    		cin>>value[i];
    	}
    	//        
    	sort(value,value+n);
    	fill(0,n-1,0);
    	for(int i=0;i<n;i++){
    		if(i)
    			cout<<" ";
    		cout<<BST[i];
    	}
    	return 0;
    } 
    

    좋은 웹페이지 즐겨찾기