浙大数据结构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 <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
int a[1024] = {0};
typedef struct node *BST;
struct node
{
    int value;
    BST left, right;
};
BST buildTree (int start, int n)  // 从start开始的n个数字,找CBST的树根
{
    if (n < 1)
    {
        return NULL;
    }
    int full = 1, botton_cnt = 1;
    while (full < n)
    {
        botton_cnt *= 2;
        full += botton_cnt;
    }
    int lack = full - n;
    int left_cnt = (full - 1) / 2;
    if (lack > botton_cnt / 2)
    {
        left_cnt -= lack - botton_cnt / 2;
    }
    // [start,start+n]
    BST root = (BST) malloc (sizeof (struct node) );
    root->value = a[start + left_cnt];
    root->left = buildTree (start, left_cnt);
    root->right = buildTree (start + left_cnt + 1, n - left_cnt - 1);
    return root;
}
int main()
{
//    system("chcp 65001");
    std::ios::sync_with_stdio (false);
    cin.tie (0);
    cout.tie (0);
//    freopen("C:/Users/zhaochen/Desktop/input.txt", "r", stdin);
    int n, i;
    cin >> n;
    for (i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    sort (a + 1, a + n + 1);
    BST root = buildTree (1, n);
    queue<BST>q;
    q.push (root);
    i = 0;
    while (!q.empty() )
    {
        BST t = q.front();
        q.pop();
        i++;
        if (i < n)
            cout << t->value << " ";
        else
            cout << t->value;
        if (t->left != NULL)
            q.push (t->left);
        if (t->right != NULL)
            q.push (t->right);
    }
    return 0;
}

数组:

#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
int a[1024] = {0};
int ans[1024] = {0};
void buildTree (int start, int n, int index)  // 从start开始的n个数字,找树根,存在下标index
{
    if (n < 1)
    {
        return;
    }
    int full = 1, botton_cnt = 1;
    while (full < n)
    {
        botton_cnt *= 2;
        full += botton_cnt;
    }
    int lack = full - n;
    int left_cnt = (full - 1) / 2;
    if (lack > botton_cnt / 2)
    {
        left_cnt -= lack - botton_cnt / 2;
    }
    // [start,start+n]
    ans[index] = a[start + left_cnt];
    buildTree (start, left_cnt, index * 2);
    buildTree (start + left_cnt + 1, n - left_cnt - 1, index * 2 + 1);
}
int main()
{
//    system("chcp 65001");
    std::ios::sync_with_stdio (false);
    cin.tie (0);
    cout.tie (0);
//    freopen("C:/Users/zhaochen/Desktop/input.txt", "r", stdin);
    int n, i;
    cin >> n;
    for (i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    sort (a + 1, a + n + 1);
    buildTree (1, n, 1);
    for (i = 1; i <= n; i++)
    {
        if (i == n)
            cout << ans[i];
        else
            cout << ans[i] << " ";
    }
    return 0;
}

上一篇:kettle 数据加载机制——全量加载


下一篇:堆空间的常用参数