二叉排序树(建树)



链接:https://www.nowcoder.com/practice/30a0153649304645935c949df7599602?tpId=40&tqId=21539&tPage=11&rp=11&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking
来源:牛客网

题目描述

二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树: 1. 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值; 2. 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值; 3. 左、右子树本身也是一颗二叉排序树。 现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。 
输入描述:
输入包含多组测试数据,每组测试数据两行。
第一行,一个数字N(N<=100),表示待插入的节点数。
第二行,N个互不相同的正整数,表示要顺序插入节点的关键字值,这些值不超过10^8。


输出描述:
输出共N行,每次插入节点后,该节点对应的父亲节点的关键字值。

输入例子:
5
2 5 1 3 4

输出例子:
-1
2
2
5
3


AC code:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define exp 1e-9
#define MAXN 1000010

using namespace std;

typedef struct BTNode{
	int data;
	BTNode *lchild;
	BTNode *rchild;
}BTNode;

void insertBT(BTNode *&bt,int x)
{
	BTNode *pre,*p;
	p=bt;
	if(p==NULL)
	{
		bt = (BTNode *)malloc(sizeof(BTNode));
		bt->data=x;
		bt->lchild=NULL;
		bt->rchild=NULL;
		printf("-1\n");
	}
	else
	{
		while(p!=NULL)
		{
			pre=p;
			if(p->data>x)
			{
				p=p->lchild;
			}
			else
			{
				p=p->rchild;
			}
		}
		p = (BTNode *)malloc(sizeof(BTNode));
		p->data=x;
		p->lchild=NULL;
		p->rchild=NULL;
		if(pre->data>x)
		{
			pre->lchild=p;
		}
		else
		{
			pre->rchild=p;
		}
		printf("%d\n",pre->data);
	}
}

int main()
{
//	freopen("D:\\in.txt","r",stdin);
	int n,i;
	int x;
	while(scanf("%d",&n)!=EOF)
	{
		BTNode *bt=NULL;
		for(i=1;i<=n;i++)
		{
			scanf("%d",&x);
			insertBT(bt,x);
		}
	}
	return 0;
}


你可能感兴趣的:(计算机考研上机实战专栏,c基础编程,模拟,算法,编程,c语言)