不要过于沉溺过去,也不要过于畅想未来,把握现在!

二叉排序树

时间限制 1000 ms 内存限制 65536 KB

题目描述

二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:

  1.        若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;
  2.        若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值;
  3.        左、右子树本身也是一颗二叉排序树。

现在给你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\n");
            continue;
          }
          insert_node(value,head);
          printf("%d\n",ans);
       }
    }
    return 0;
}

 

posted @ 2015-07-07 11:24  coding_yuan  阅读(977)  评论(0编辑  收藏  举报

不要过于沉溺过去,也不要过于畅想未来,把握现在!