ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

浙大数据结构04-树6 Complete Binary Search Tree_完全二叉搜索树

2021-10-31 18:04:51  阅读:154  来源: 互联网

标签:Binary Search full botton Complete int cnt start left


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;
}

标签:Binary,Search,full,botton,Complete,int,cnt,start,left
来源: https://blog.csdn.net/m0_51800757/article/details/121065452

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有