1064 Complete Binary Search Tree (30point(s)) - C語言 PAT 甲級

1064 Complete Binary Search Tree (30point(s))

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

題目大意:

輸入一組序列,輸出該序列組成完全二叉搜索樹後的層序遍歷

設計思路:
  • 序列排序後,即爲二叉搜索樹的中序遍歷
  • 又是完全二叉樹,孩子節點的位置爲父節點的 2 倍和 2 倍加 1
  • 將這些性質結合,在中序遍歷時,將中序序列賦值給層序序列
編譯器:C (gcc)
#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b)
{
        return *((int *)a) - *((int *)b);
}

int n, in[1010], level[1010], pos = 0;

void order(int root)
{
        if (root >= n)
                return;
        order(root * 2 + 1);
        level[root] = in[pos++];
        order(root * 2 + 2);
}

int main(void)
{
        int i;

        scanf("%d", &n);
        for (i = 0; i < n; i++)
                scanf("%d", &in[i]);
        qsort(in, n, sizeof(in[0]), cmp);
        order(0);

        printf("%d", level[0]);
        for (i = 1; i < n; i++)
                printf(" %d", level[i]);

        return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章