二叉排序树

题目描述
 

二叉排序树,也称为二叉查找树。

可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:

  1. 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;
  2. 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值;
  3. 左、右子树本身也是一颗二叉排序树。

现在给你 N 个关键字值各不相同的节点。

要求你将这些节点按顺序插入一个初始为空树的二叉排序树中。

每次成功插入一个节点后,求其相应的父亲节点的关键字值,如果没有父亲节点,则输出 −1−1。

 

输入格式

第一行包含整数 N�,表示待插入的节点数。

第二行包含 N� 个互不相同的正整数,表示要顺序插入节点的关键字值。

数据范围

1≤N≤100,
节点关键字值取值范围 [1,1e8]
 

输入样例:
5
2 5 1 3 4
输出样例:
-1
2
2
5
3
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;

const int N = 110;
unordered_map<int,int> r,l;
int root = -1;


//使用dfs构建排序二叉树
//r[x],l[x]代表以x为根的右节点和左结点
int dfs(int f,int x){
    if(f == -1){
        root = x;
        return f;
    }
    if(x > f){
        if(!r.count(f)){
            r[f] = x;
            return f;
        }
        else{
            return dfs(r[f],x);
        }
    }
    if(x < f){
        if(!l.count(f)){
            l[f] = x;
            return f;
        }
        else{
            return dfs(l[f],x);
        }
    }
    
}




int main(){
    int n;
    int x;
    cin >> n;
    while(n --){
        scanf("%d",&x);
        cout << dfs(root,x) << endl;
    }
    return 0;
}

 来源:AcWing 3595. 二叉排序树 - AcWing

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值