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

来源:互联网 发布:淘宝网童装女童外套 编辑:程序博客网 时间:2024/05/10 07:13



/** * 输入一系列整数,建立二叉排序树, * 并进行前序、中序、后序遍历。 * 不计入重复元素。 * 方法:注意二级指针的使用, * 相当于引用一级指针, * 被调函数能改变调用函数的变量。 */#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);    }}


0 0
原创粉丝点击