九度OJ 1467 二叉排序树

来源:互联网 发布:python 相似度算法 编辑:程序博客网 时间:2024/05/15 04:24
题目描述:

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


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


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

输入:

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

输出:

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

样例输入:
52 5 1 3 4
样例输出:
-1225

3

思路分析:

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

代码如下:

#include<stdio.h>#include<stdlib.h>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;}}elseif (num < T->element){if (T->left==NULL)   printf("%d\n", T->element); //如果可以插入,则输出当前节点的值,即父节点的值。if判断不能少!T->left = insert(num, T->left);}elseif (num > T->element){if (T->right==NULL)   printf("%d\n", T->element);<span style="font-family: 'MicroSoft Yahei', Helvetica, Arial, Georgia, Simsun;">//如果可以插入,则输出当前节点的值,即父节点的值。if判断不能少!</span>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需要慢慢消化,基础不打劳,真的需要很多功夫来弥补。

0 0
原创粉丝点击