5-7 Complete Binary Search Tree (30分)

来源:互联网 发布:软件采样稳定信号算法 编辑:程序博客网 时间:2024/06/01 10:56
5-7 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


  • 根据题目要求我们建造一个完全二叉搜索树,然后用层序遍历输出

  • 思路(参考了算法笔记书上的思路):可以用数组来储存完全二叉搜索树,完全二叉搜索树每个根结点X,对应根结点的左子树为2X,

  • 右子树为2X+1。对输入进的数进行从小到大排序,而中序遍历二叉搜索树得到的数列也是从小到大。因此可以用中序遍历的方法

  • 将排好的数列储存在另一个数组中,得到的数组就是一个完全二叉搜索树。


  • #include<stdio.h>#include<stdlib.h>#include<algorithm>using namespace std;int a[1001];int b[1001];int n,count1 = 0;void bianli(int root)/*传入根结点的序号*/{if(root > n)return;/*空结点退出*/bianli(root * 2);/*向左遍历*/b[root] = a[count1++];/*将a中排好的数赋值到b中*/bianli(root * 2 + 1);/*向右遍历*/}int main(void){scanf("%d",&n);for(int i = 0; i < n; i++){scanf("%d",&a[i]);}sort(a,a + n);bianli(1);for(int i = 1; i <= n; i++){printf("%d",b[i]);if(i < n){printf(" ");}}return 0;}


  • 0 0
    原创粉丝点击