-
题目描述:
-
二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:
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<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; } } 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);<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需要慢慢消化,基础不打劳,真的需要很多功夫来弥补。