您的位置:首页 > 其它

二叉排序树(二叉搜索树,BST)的使用

2015-09-07 20:49 211 查看
/**
* 输入一系列整数,建立二叉排序树,
* 并进行前序、中序、后序遍历。
* 不计入重复元素。
* 方法:注意二级指针的使用,
* 相当于引用一级指针,
* 被调函数能改变调用函数的变量。
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct treeNode {
int dat;
struct treeNode * lch, * rch;
} treeNode_t;

void BST_insert(treeNode_t ** pp, int keyVal) {
treeNode_t * pNew;
if (*pp == NULL) {
pNew = (treeNode_t *)malloc(sizeof (treeNode_t));
pNew->lch = NULL;
pNew->rch = NULL;
pNew->dat = keyVal;
*pp = pNew;
} else if (keyVal < (*pp)->dat) {
BST_insert(&((*pp)->lch), keyVal);
} else if (keyVal > (*pp)->dat) {
BST_insert(&((*pp)->rch), keyVal);
}
}

void visit(treeNode_t * p) {
printf("%d ", p->dat);
}

void preOrder(treeNode_t * p, void (* pVis)(treeNode_t *)) {
if (p == NULL)
return;

(*pVis)(p);
preOrder(p->lch, pVis);
preOrder(p->rch, pVis);
}

void inOrder(treeNode_t * p, void (* pVis)(treeNode_t *)) {
if (p == NULL)
return;

inOrder(p->lch, pVis);
(*pVis)(p);
inOrder(p->rch, pVis);
}

void postOrder(treeNode_t * p, void (* pVis)(treeNode_t *)) {
if (p == NULL)
return;

postOrder(p->lch, pVis);
postOrder(p->rch, pVis);
(*pVis)(p);
}

void BST_destroy(treeNode_t ** pp) {
if (*pp) {
BST_destroy(&((*pp)->lch));
BST_destroy(&((*pp)->rch));
free(*pp);
//*pp = NULL;
}
}

void main() {
int n, m;
treeNode_t * pTree = NULL;
while (scanf("%d", &n) == 1) {
pTree = NULL;   //!!!初始化为空树
while (n--) {
scanf("%d", &m);
BST_insert(&pTree, m);
}

preOrder(pTree, visit);
putchar('\n');

inOrder(pTree, visit);
putchar('\n');

postOrder(pTree, visit);
putchar('\n');

BST_destroy(&pTree);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: