题目1467:二叉排序树
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:1169
解决:456
- 题目描述:
-
二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:
1. 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;
2. 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值;
3. 左、右子树本身也是一颗二叉排序树。
现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。
- 输入:
-
输入包含多组测试数据,每组测试数据两行。
第一行,一个数字N(N<=100),表示待插入的节点数。
第二行,N个互不相同的正整数,表示要顺序插入节点的关键字值,这些值不超过10^8。
- 输出:
-
输出共N行,每次插入节点后,该节点对应的父亲节点的关键字值。
- 样例输入:
-
5 2 5 1 3 4
- 样例输出:
-
-1 2 2 5 3
- 来源:
- 2012年北京邮电大学计算机研究生机试真题
-
1 #include<stdio.h> 2 #include<stdlib.h> 3 struct BT{ 4 int m,f; 5 struct BT *l,*r; 6 }tree[100],*T; 7 8 void Tree_Insert(struct BT *Q,struct BT *q) 9 { 10 struct BT * p; 11 p=Q; 12 while(1) 13 { 14 q->f=p->m; 15 if(q->m>p->m) 16 { 17 if(p->r!=NULL) 18 p=p->r; 19 else { 20 p->r=q; 21 break; 22 } 23 } 24 else { 25 if(p->l!=NULL) 26 p=p->l; 27 else { 28 p->l=q; 29 break; 30 } 31 } 32 } 33 } 34 35 int main() 36 { 37 int n,i; 38 39 while(scanf("%d",&n)!=EOF) 40 { 41 scanf("%d",&tree[0].m); 42 tree[0].r=NULL; 43 tree[0].l=NULL; 44 tree[0].f=-1; 45 T=&tree[0]; 46 for(i=1; i<n; i++) 47 { 48 scanf("%d",&tree[i].m); 49 tree[i].r=NULL; 50 tree[i].l=NULL; 51 Tree_Insert(T, &tree[i]); 52 } 53 for(i=0; i<n; i++) 54 printf("%d\n",tree[i].f); 55 } 56 57 return 0; 58 }