当前位置: 首页 > news >正文

1099 Build A Binary Search Tree(超详细注解+38行代码)

分数 30

全屏浏览题目

作者 CHEN, Yue

单位 浙江大学

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.

Given the structure of a binary tree and a sequence of distinct integer keys, there is only one way to fill these keys into the tree so that the resulting tree satisfies the definition of a BST. You are supposed to output the level order traversal sequence of that tree. The sample is illustrated by Figure 1 and 2.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤100) which is the total number of nodes in the tree. The next N lines each contains the left and the right children of a node in the format left_index right_index, provided that the nodes are numbered from 0 to N−1, and 0 is always the root. If one child is missing, then −1 will represent the NULL child pointer. Finally N distinct integer keys are given in the last line.

Output Specification:

For each test case, print in one line the level order traversal sequence of that tree. All the numbers must be separated by a space, with no extra space at the end of the line.

Sample Input:

9
1 6
2 3
-1 -1
-1 4
5 -1
-1 -1
7 -1
-1 8
-1 -1
73 45 11 58 82 25 67 38 42

Sample Output:

58 25 82 11 38 67 45 73 42

代码长度限制

16 KB

时间限制

200 ms

内存限制

64 MB

#include<bits/stdc++.h>
using namespace std;
const int N=105; 
int l[N],r[N];//分别保存当前结点的左右孩子结点 
int a[N],res[N];//a[N]保存中序序列的值,res[N]保存每个结点对应的值 
void inorder(int root,int &k){//中序遍历结点并将中序序列按顺序填入各节点 
    if(l[root]!=-1)inorder(l[root],k);//若有左孩子,递归遍历 
    res[root]=a[k++];//将值保存在对应结点的位置 
    if(r[root]!=-1)inorder(r[root],k);//若有有孩子,递归遍历 
    return ;    
}
void levelorder(int root){//层序遍历 
    queue<int>q;
    q.push(root);//根结点入队 
    while(q.size()){//队列中有元素 
        int f=q.front();//获得队头元素 
        q.pop();//出队 
        if(l[f]!=-1)q.push(l[f]);//若队头结点有左孩子,则将左孩子入队 
        if(r[f]!=-1)q.push(r[f]);//若队头结点有右孩子,则将右孩子入队
        cout<<res[f];//输出队头结点对应的值 
        if(q.size())cout<<' ';//若队列还有元素输出空格,最后一个元素不用输出 
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){//从第0个结点到第n-1个结点,保存各结点的左右孩子结点 
        int lchild,rchild;
        cin>>lchild>>rchild;
        l[i]=lchild,r[i]=rchild;
    }
    for(int i=0;i<n;i++)cin>>a[i];//输入给定初始序列 
    sort(a,a+n);//从小到大排序,即中序序列 
    int k=0;//用于记录当前的结点 
    inorder(0,k);//0表示根结点 
    levelorder(0);//层序遍历 
    return 0;
}

http://www.lryc.cn/news/67794.html

相关文章:

  • [刷题]贪心入门
  • 项目集战略一致性
  • Linux学习 Day3
  • 前端开发推荐vscode安装什么插件?
  • 如何打造完整的客户服务体系?
  • 裸奔时代,隐私何处寻?
  • 从期望最大化(EM)到变分自编码器(VAE)
  • 【数学杂记】表达式中的 s.t. 是什么意思
  • flink watermark介绍及watermark的窗口触发机制
  • Spring Cloud: 云原生微服务实践
  • 存bean和取bean
  • 39. 组合总和
  • 100行以内Python能做那些事
  • Android 电源键事件流程分析
  • 游戏搬砖简述-1
  • 多线程基础总结
  • 视频理解AI模型分类与汇总
  • 【Linux】多线程 --- 线程同步与互斥+生产消费模型
  • 17.模型的定义
  • golang 记录交叉编译sqlite的报错信息 go build -ldflags
  • ChatGPT AI使用成本
  • 腾讯云与中电金信发布联合核心方案
  • 老胡的周刊(第090期)
  • 2023-数仓常见问题以及解决方案
  • 没关系,前端还死不了
  • OpenSSL-基于IP或域名生成自签名证书脚本
  • 如何在C#中创建和使用自定义异常
  • 通过systemctl管理服务
  • 面经|小红书经营分析师
  • abpvnext后台工作者使用quartz扩展的一些思路和使用细节记录--(未完待续)