坦然玲子  

题目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 }

 

posted on 2013-04-09 23:11  坦然玲子  阅读(336)  评论(0编辑  收藏  举报