AcWing 3595:二叉排序树 ← 数组模拟

【题目来源】
https://www.acwing.com/problem/content/3598/

【题目描述】
二叉排序树,也称为二叉查找树。
可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:
1.若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;
2.若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值;
3.左、右子树本身也是一颗二叉排序树。
现在给你 N 个关键字值各不相同的节点。
要求你将这些节点按顺序插入一个初始为空树的二叉排序树中。
每次成功插入一个节点后,求其相应的父亲节点的关键字值,如果没有父亲节点,则输出 −1。

【输入格式】
第一行包含整数 N,表示待插入的节点数。
第二行包含 N 个互不相同的正整数,表示要顺序插入节点的关键字值。

【输出格式】
N 行。

【输入样例】
5
2 5 1 3 4

【输出样例】
-1
2
2
5
3

【数据范围】
1≤N≤100,
节点关键字值取值范围 [1,10^8]。

【算法分析】
● 二叉排序树(Binary Sort Tree,BST),又称二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树。
(1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)它的左、右子树也分别为二叉排序树。

● 二叉排序树遵循“左小右大”规则,树中没有相同关键字的结点。

● 中序遍历一棵二叉排序树可以得到一个结点值递增的有序序列。

● 东方博宜OJ 2195:二叉排序树:https://blog.csdn.net/hnjzsyjyj/article/details/164402681

【算法代码】

#include <bits/stdc++.h>
using namespace std;

const int maxn=1e5+5;
int lch[maxn],rch[maxn];
int val[maxn];
int tot;

int new_node(int x) {
    tot++;
    val[tot]=x;
    lch[tot]=0;
    rch[tot]=0;
    return tot;
}

int insert(int u,int x) {
    if(x<val[u]) {
        if(lch[u]==0) {
            lch[u]=new_node(x);
            return val[u];
        } else insert(lch[u],x);
    } else {
        if(rch[u]==0) {
            rch[u]=new_node(x);
            return val[u];
        } else insert(rch[u],x);
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n,x,root;
    cin>>n;
    for(int i=1; i<=n; i++) {
        cin>>x;
        if(i==1) {
            root=new_node(x);
            cout<<-1<<"\n";
        } else cout<<insert(root,x)<<"\n";
    }
    return 0;
}

/*
in:
5
2 5 1 3 4

out:
-1
2
2
5
3
*/





【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/164402681
https://blog.csdn.net/hnjzsyjyj/article/details/164403599
https://blog.csdn.net/hnjzsyjyj/article/details/163743086
https://blog.csdn.net/hnjzsyjyj/article/details/154818899
 

posted @ 2026-09-06 21:02  Triwa  阅读(7)  评论(0)    收藏  举报