和上一篇一样先建了一颗树用于实验: 实现了三种遍历方法:先序遍历,中序遍历,后序遍历。以以上的树为例输出的结果应为:A, B, D, C, E, F; B, D, A, E, C, F; D, B, E, F, C, A. /************************************************************************/ /* author : thomas E-mail: chenhua308@gmail.com */ /************************************************************************/ #include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct btnode{ //btnode - binary tree node struct btnode *Rchild; struct btnode *Lchild; char element; } BTNODE; //栈数据结构定义 typedef struct stacknode { struct stacknode *link; BTNODE *element; } STACKNODE; typedef BTNODE *BTree; typedef STACKNODE *STACK; int is_empty( STACK top ) { return top == NULL; } //压栈 void push( STACK *top, BTNODE *Element ) { STACKNODE *p; p = ( STACKNODE * )malloc( sizeof( STACKNODE ) ); p -> element = Element; if ( *top == NULL ) { *top = p; p -> link = NULL; } else { p -> link = *top; *top = p; } } //出栈 BTNODE *pop( STACK *top ) { STACKNODE *p; BTNODE *tmp; p = *top; *top = p -> link; tmp = p -> element; free(p); return tmp; } //获取栈顶的值 BTNODE *GetTop( STACK top ) { return top -> element; } BTree creat() //用比较笨的方法创建一颗指定的树为了验证函数用 { BTNODE *temp, *root; root = (BTNODE *)malloc(sizeof(BTNODE)); root -> element = 'A'; root -> Lchild = (BTNODE *)malloc(sizeof(BTNODE)); temp = root -> Lchild; temp -> element = 'B'; temp -> Lchild = NULL; temp -> Rchild = (BTNODE *)malloc(sizeof(BTNODE)); temp -> Rchild -> element = 'D'; temp -> Rchild -> Lchild = NULL; temp -> Rchild -> Rchild = NULL; root -> Rchild = (BTNODE *)malloc(sizeof(BTNODE)); temp = root -> Rchild; temp -> element = 'C'; temp -> Lchild = (BTNODE *)malloc(sizeof(BTNODE)); temp -> Lchild -> element = 'E'; temp -> Lchild -> Lchild = NULL; temp -> Lchild -> Rchild = NULL; temp -> Rchild = (BTNODE *)malloc(sizeof(BTNODE)); temp -> Rchild -> element = 'F'; temp -> Rchild -> Lchild = NULL; temp -> Rchild -> Rchild = NULL; return root; } //先序遍历非递归实现 void stack_traverse_preOrd(BTree btree) //这里不再用函数指针了,假定存储的就是整型数 { STACK s = NULL; //BTNODE *p = btree; if ( NULL == btree ) printf("the tree is empty! /n"); //exit(EXIT_FAILURE); push( &s, btree ); while ( !is_empty(s) ) { //btree = GetTop(s); btree = pop(&s); printf( "%c /n", btree -> element ); if ( btree -> Rchild ) push( &s, btree -> Rchild ); if ( btree -> Lchild ) //btree = btree -> Lchild; push( &s, btree -> Lchild) ; } } //中序遍历非递归实现 void stack_traverse_inOrd(BTree T) { STACK s = NULL; BTNODE *pPrev = NULL; if ( NULL == T ) printf("the tree is empty! /n"); /*if ( T -> Rchild != NULL ) push( &s, T -> Rchild );*/ push( &s, T ); while ( !is_empty(s) ) { T = GetTop( s ); if ( T -> Lchild != NULL && (pPrev == T -> Lchild || pPrev == T -> Lchild -> Rchild) ) //左孩子已输出 { T = pop( &s ); printf("%c /n", T -> element); pPrev = T; continue; } if ( T -> Lchild == NULL && T -> Rchild == NULL ) { T = pop( &s ); printf("%c /n", T -> element); pPrev = T; continue; } if ( T -> Rchild != NULL ) { pop( &s ); push( &s, T -> Rchild ); push( &s, T ); if ( T -> Lchild != NULL ) push( &s, T -> Lchild ); else { T = pop( &s ); printf("%c /n", T -> element); pPrev = T; } continue; } push( &s, T -> Lchild ); } } //后序遍历用栈实现 void stack_traverse_postOrd(BTree T) { STACK s = NULL; BTNODE *pPrev = NULL; if ( T == NULL ) printf("the tree is empty! /n"); push( &s, T ); while ( !is_empty( s ) ) { T = GetTop( s ); if ( NULL != T -> Lchild && pPrev == T -> Lchild ) //从左孩子返回 { T = pop( &s ); printf( "%c /n", T -> element ); pPrev = T; continue; } if ( NULL != T -> Rchild && pPrev == T -> Rchild ) //从右孩子返回 { T = pop( &s ); printf("%c /n", T -> element ); pPrev = T; continue; } if ( T -> Lchild != NULL || T -> Rchild != NULL ) { if ( T-> Lchild != NULL ) { if ( T -> Rchild != NULL ) push( &s, T -> Rchild ); push( &s, T -> Lchild ); } else push( &s, T -> Rchild ); } else { T = pop( &s ); printf("%c /n", T -> element ); pPrev = T; } } } //test functions void main(int argc, char *argv[]) { BTree btree; btree = creat(); stack_traverse_preOrd(btree); printf("******************************* /n"); stack_traverse_inOrd(btree); printf("******************************* /n"); stack_traverse_postOrd(btree); //Stack_PostOrderTraverse(btree); }