九度OJ 1467 二叉排序树

题目描述:

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


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


  现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。

输入:

输入包含多组测试数据,每组测试数据两行。
第一行,一个数字N(N<=100),表示待插入的节点数。
第二行,N个互不相同的正整数,表示要顺序插入节点的关键字值,这些值不超过10^8。

输出:

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

样例输入:
5
2 5 1 3 4
样例输出:
-1
2
2
5

3

思路分析:

才看到这道题时,第一印象就是要构建二叉树了。当然C++库里有,但是我只会C语言啊。拿出书本来,看了看,感觉可以,于是就一气呵成,敲代码,编译,调试,通过。太痛快了。

代码如下:

#include
#include
typedef struct bintree{
	int element;
	struct bintree *left;
	struct bintree *right;
}bintree;          //递归调用中必须为结构取一个名字
bintree* makeempty(bintree *n)   //没有用到,功能是初始化(引自 《数据结构与算法分析》)
{
	if (n != NULL)
	{
		makeempty(n->left);
		makeempty(n->right);
		free(n);
	}
	return NULL;
}
bintree* create(int num)//初始化创建一个二叉树
{
	bintree *n = malloc(sizeof(bintree));
	n->element = num;
	n->left = NULL;
	n->right = NULL;
	return n;
}
bintree* insert(int num, bintree *T) //插入操作
{
	if (T == NULL)
	{
		T = malloc(sizeof(bintree));
		if (T == NULL)
			printf("Out of space!");
		else
		{
			T->element = num;
			T->left = T->right = NULL;
		}
	}
	else
		if (num < T->element)
		{
			if (T->left==NULL)
			   printf("%d\n", T->element); //如果可以插入,则输出当前节点的值,即父节点的值。if判断不能少!
			T->left = insert(num, T->left);
		}
		else
			if (num > T->element)
			{
				if (T->right==NULL)
				   printf("%d\n", T->element);//如果可以插入,则输出当前节点的值,即父节点的值。if判断不能少!

				T->right = insert(num, T->right);
			}
	return T;
}
/*void release(bintree *n)      //原来自己写的释放二叉树的代码,结果一直报错。终于知道了,n->element不能free;
{
	if (n){
		if (n->left){
			release(n->left);
		}
		if (n->right){
			release(n->right);
		}
		if (n->element){
			release(n->element);   //如果element是char型,使用过strup()赋值则必须要free,否则会造成内存泄露
		}
		free(n);
	}
}*/
void release(bintree* pRoot)
{
	if (!pRoot)
		return;
	free(pRoot->right);
	free(pRoot->left);
	free(pRoot);
}
int main(void)
{
	int sum, i;
	int A[101];
	while (scanf("%d", &sum) != EOF)
	{
		for (i = 0; i < sum; i++)
		{
			scanf("%d", &A[i]);
		}
		bintree *start = create(A[0]);
		printf("-1\n");
		for (i = 1; i < sum; i++)
		{
			start = insert(A[i], start);
		}
		release(start); //最后释放二叉树
	}
	return 0;
}

收获:

1、完整地构造了二叉树这一数据结构,虽然很浅,但是也算是一种进步;

2、不能照搬代码,比如说自己照搬release(注释过的哪那一段),取自《Head First C》,没有考虑到原来代码中使用过strup()函数,而自己的没有,随意乱用,导致了一个自己无法找出来的Bug,今后要铭记教训。

3、用递归的方法来free需要慢慢消化,基础不打劳,真的需要很多功夫来弥补。

你可能感兴趣的:(C语言,OJ)