데이터 구조 04 - 트 리 6 Complete Binary Search Tree
12102 단어 데이터 구조데이터 구조 (저장 성)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.