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



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

#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);
    }
}


你可能感兴趣的:(二叉排序树(二叉搜索树,BST)的使用)