-
问题描述
给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。
-
输入格式
测试数据有两行。第一行是一个数字N(N<=100),表示待插入的节点数。第二行是N个互不相同的正整数,表示要顺序插入节点的关键字值,这些值不超过10^8。
-
输出格式
输出共N行,每次插入节点后,输出该节点对应的父亲节点的关键字值。
-
样例输出
5
2 5 1 3 4 -
样例输出
-1
2
2
5
3 -
完整代码
#include<stdio.h>
#include<stdlib.h>
int n,num[100];
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void Insert(BiTree &T,int i)
{
//插入节点必为叶子节点
if(!T)//创建节点
{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=i;
T->lchild=NULL;
T->rchild=NULL;
}
//如果节点已经存在,根据i值与节点值的大小判断插入左/右子树
else if(T->data>i)
Insert(T->lchild,i);
else if(T->data<i)
Insert(T->rchild,i);
}
BiTree Create()
{
int i=1;
BiTree T=NULL;
while(i<=n)
{
Insert(T,num[i]);//依次插入
i++;
}
return T;
}
int Search(BiTree &T,int i)
{
if(T&&(T->lchild||T->rchild))//节点存在且不为叶子节点
{
if(i<T->data)//去左子树搜索
{
if(T->lchild->data==i)//等于T左孩子
return T->data;
else return Search(T->lchild,i);
}
if(i>T->data)//去右子树搜索
{
if(T->rchild->data==i)
return T->data;
else return Search(T->rchild,i);
}
else return -1;//根节点的情况
}
else
return -1;
}
int main()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
BiTree T=Create();//创建二叉排序树
BiTree B=T;
for(i=1;i<=n;i++)
printf("%d\n",Search(T,num[i]));//输出父节点
return 0;
}