题目描述
二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:
(1)若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;
(2)若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值;
(3)左、右子树本身也是一颗二叉排序树。
现在给定N个关键字值各不相同的节点,要求按顺序插入一个初始为空树的二叉排序树中,每次插入成功后求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。
输入
输入包含多组测试数据,每组测试数据两行。第一行为一个数字N(N<=100),表示待插入的节点数。第二行为N个互不相同的正整数,表示要顺序插入节点的关键字值,这些值不超过1000。
输出
输出共N行,每次插入节点后,该节点对应的父亲节点的关键字值。
样例输入
5
2 5 1 3 4
样例输出
-1
2
2
5
3
这题主要是关于二叉排序树的使用的,只要理解什么是二叉排序树,那么这道题就非常简单了,有关二叉排序树的详解请见二叉排序树
题解
#include<iostream>
#define N 110
using namespace std;
int str[N],arr[N]={0};
void CreatHeap(int t){
int fa,son;
fa=0;
if(str[fa]>t)
son=2*fa+1;
else
son=2*fa+2;
while(1){
if(!str[son]){
str[son]=t;
cout<<str[(son-1)/2]<<endl;
break;
}
else{
fa=son;
if(str[fa]>t)
son=2*fa+1;
else
son=2*fa+2;
}
}
}
int main(){
int n,t;
cin>>n;
cin>>t;
str[0]=t;
arr[0]=1;
cout<<"-1"<<endl;
for(int i=1;i<n;i++){
cin>>t;
CreatHeap(t);
}
return 0;
}