1099 Build A Binary Search Tree (30 分)*

跟着柳婼学姐学习的笔记ヾ(≧▽≦*)o


原题目: 1099 Build A Binary Search Tree (30 分).

题意

给出一棵二叉搜索树每个结点的左右孩子,根结点ID为0,要求插入数值,
👉输出层序遍历序列。

分析

  1. 关键: BST的中序遍历序列是非递减序列,而题目又单独给出BST的数据序列,故不需要真的建树——① 将数据序列递增排列(这就与中序序列一一对应了);② 用DFS从根结点开始中序遍历,就可以依次给每个结点赋予相应的数据,以及完全二叉树规则的下标和层次。
  2. 中序转层序——根据下标和层次进行排序,即可得到层序序列。

CODE

#include <iostream>
#include <algorithm>
using namespace std;
int n, cnt = 0;
int b[100];  //存储数据
struct node{
    int data;
    int lchild, rchild;
    int index;  //按完全二叉树存放在数组中
    int layer;
}a[110];
bool cmp(node a, node b){  //按层序排序
    if ( a.layer!=b.layer ) return a.layer<b.layer;
    return a.index<b.index;
}
void DFS(int root, int index, int layer);
int main()
{
    cin >> n;
    for ( int i=0; i<n; i++ )
        cin >> a[i].lchild >> a[i].rchild;
    for ( int i=0; i<n; i++ )
        cin >> b[i];
    //构建BST
    sort(b, b+n);  //BST的层序序列满足非递减序列
    DFS(0, 1, 1);  //按BST赋予值,按完全二叉树赋予下标和层次
    sort(a, a+n, cmp);  //转成层序序列
    for ( int i=0; i<n; i++ ){
        if ( i!=0 ) cout << " ";
        cout << a[i].data;
    }
    
    return 0;
}
void DFS(int root, int index, int layer){
    if ( a[root].lchild==-1 && a[root].rchild==-1 )
        a[root] = {b[cnt++], a[root].lchild, a[root].rchild, index, layer};
    else{
        if ( a[root].lchild!=-1 )
            DFS(a[root].lchild, 2*index, layer+1);
        a[root] = {b[cnt++], a[root].lchild, a[root].rchild, index, layer};
        if ( a[root].rchild!=-1 )
            DFS(a[root].rchild, 2*index+1, layer+1);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值