东方博宜OJ 2195:二叉排序树 ← 数组模拟

【题目来源】
https://oj.czos.cn/p/2195

【题目描述】
从键盘读入 n 个不相同的整数,以每个整数作为结点的值,来创建一棵二叉排序树,假设读入的第 1 个点是这棵树的根结点。
请求出这棵二叉排序树中序和后续遍历的结果?

【输入格式】
共两行,第一行为整数 n。;
第二行为 n 个不重复的整数 ai。
(0<n<10^5,1≤ai≤10^5,本题中 ai 为随机生成的数值)

【输出格式】
共两行,第一行为中序遍历的结果,第二行为后序遍历的结果,同一行的输出用空格隔开。

【输入样例】
8
23 45 12 6 7 89 13 47

【输出样例】
6 7 12 13 23 45 47 89 
7 6 13 12 47 89 45 23

【数据范围】
0<n<10^5,1≤ai≤10^5

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

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

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

● ​​​​​​​lch[u] 左孩子,rch[u] 右孩子,初始全部为 0(0 表示空)。​​​​​​​

【算法代码】

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

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

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

void in(int u) { //in-Order
    if(u==0) return;
    in(lch[u]);
    cout<<u<<" ";
    in(rch[u]);
}

void post(int u) { //post-Order
    if(u==0) return;
    post(lch[u]);
    post(rch[u]);
    cout<<u<<" ";
}

int main() {
    int n,x,root;
    cin>>n;
    for(int i=1; i<=n; i++) {
        cin>>x;
        if(i==1) root=x;
        else insert(root,x);
    }

    in(root),cout<<endl,post(root);
    return 0;
}

/*
in:
8
23 45 12 6 7 89 13 47

out:
6 7 12 13 23 45 47 89
7 6 13 12 47 89 45 23
*/



【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/163724358
https://blog.csdn.net/a10b12c13d14e15/article/details/164401168
https://blog.csdn.net/hnjzsyjyj/article/details/120397275
https://blog.csdn.net/hnjzsyjyj/article/details/154818899


posted @ 2026-09-05 20:32  Triwa  阅读(16)  评论(0)    收藏  举报