其他分享
首页 > 其他分享> > 浙大数据结构04-树6 Complete Binary Search Tree_完全二叉搜索树

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

作者:互联网

A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:

 链表:

#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