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