1064 Complete Binary Search Tree (30 分)完全二叉树

1064 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 NNN (≤1000\le 10001000). Then NNN 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<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<string>
#include<map>
#include<set>
using namespace std;
int k=1;
void create(int tree[],int root,int n,int a[])
{
    if(root>n)
        return;
    create(tree,2*root,n,a);
    tree[root]=a[k++];
    create(tree,2*root+1,n,a);
}

void level(int tree[],int n)
{
    queue<int> qu;
    qu.push(1);
    cout<<tree[1];
    while(!qu.empty())
    {
        int temp=qu.front();
        qu.pop();
        if(2*temp<=n)
        {
            qu.push(2*temp);
            cout<<" "<<tree[2*temp];
        }
        if(2*temp+1<=n)
        {
            qu.push(2*temp+1);
            cout<<" "<<tree[2*temp+1];
        }
    }
}


int main()
{
    int n;
    cin>>n;
    int a[n+1];
    for(int i=1;i<n+1;i++)
        cin>>a[i];
    sort(a+1,a+n+1);
    int tree[n+1];
    create(tree,1,n,a);
    //level(tree,n);
    cout<<tree[1];
    for(int i=2;i<n+1;i++)
        cout<<" "<<tree[i];
    return 0;
}

 

 
    原文作者:算法小白
    原文地址: https://www.cnblogs.com/zhanghaijie/p/10308327.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞