97. 二叉排序树
时间限制 1000 ms 内存限制 65536 KB
题目描述
二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:
- 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;
- 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值;
- 左、右子树本身也是一颗二叉排序树。
现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。
输入格式
第一行,一个数字N(N<=100),表示待插入的节点数。
第二行,N个互不相同的正整数,表示要顺序插入节点的关键字值,这些值不超过108。
输出格式
输出共N行,每次插入节点后,该节点对应的父亲节点的关键字值
输入样例
5
2 5 1 3 4
输出样例
-1 2 2 5 3
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; const int maxn=107; struct node { int value; node *left,*right; }; node *head; void init() { head=(node *)malloc(sizeof(node)); head->left=head->right=NULL; } int ans; void insert_node(int value,node *father) { if(value<father->value) { if(father->left==NULL) { node *p; p=(node *)malloc(sizeof(node)); p->left=p->right=NULL; p->value=value; father->left=p; ans=father->value; return; } else insert_node(value,father->left); } else{ if(father->right==NULL) { node *p; p=(node *)malloc(sizeof(node)); p->left=p->right=NULL; p->value=value; father->right=p; ans=father->value; return; } else insert_node(value,father->right); } } int main() { int n,value; while(~scanf("%d",&n)) { init(); for(int i=0;i<n;i++) { scanf("%d",&value); if(i==0) { head->value=value; printf("-1 "); continue; } insert_node(value,head); printf("%d ",ans); } } return 0; }