1. 题目描述
给定⼀个 1~n 的排列 P,即⻓度为 n,且 1~n 中所有数字都恰好出现⼀次的序列。现在按顺序将排列中的元素⼀⼀插⼊到初始为空的⼆叉搜索树中(左小右大),问最后每个节点的⽗亲节点的元素是什么。特别地,根节点的⽗亲节点元素视为 0。
输入样例的二叉树搜索树如下:1 的⽗亲为 2,2 为根结点,所以⽗亲为 0,3 的⽗亲为 2,4 的⽗亲为 5,5 的⽗亲为 3。
输入描述
第⼀⾏⼀个整数 n (1<=n<=10^5),表⽰排列 P 中的元素个数。
第⼆⾏ n 个整数 p1, p2, …, pn (1<=pi<=n, 1<=i<=n),表⽰给定的排列。
输出描述
⼀⾏ n 个整数,其中第 i 个整数 ai 表⽰元素 i 对应节点的⽗亲节点的元素。特别地,根节点的⽗亲节 点元素视为 0。
输入样例
5
2 3 5 1 4
输出样例
2 0 2 5 3
2. 我的尝试
用数组存储二叉搜索树,并额外保存每个节点父节点的信息。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int h[N], f[N];
int n;
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
if (i == 0) h[1] = x;
else {
int p = 1;
while (h[p])
{
if (x < h[p]) p = p * 2;
else p = p * 2 + 1;
}
h[p] = x;
f[x] = h[p/2];
}
}
for (int i = 1; i <= n; i++)
cout << f[i] << " ";
}