首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

二叉树的非递归遍历(c语言 链式存储)

2013-03-12 
二叉树的非递归遍历(c语言 链式储存)#includestdio.h#includestdlib.h#define MAXSIZE 200/* 定义二叉

二叉树的非递归遍历(c语言 链式储存)

#include<stdio.h>#include<stdlib.h>  #define MAXSIZE 200    /* 定义二叉树节点类型 */  typedef struct node  { char data;struct node *lchild, *rchild;  }BTNode;     /* 函数声明 */  BTNode* CreatBitTree();  void PreOrder(BTNode*);  void InOrder(BTNode*);  void PostOrder(BTNode*);     /* 主函数 */  int main()  { BTNode *root = NULL; root = CreatBitTree(); PreOrder(root); InOrder(root);          PostOrder(root); system("pause");return 0;  }    /* 递归前序建立二叉树 */  BTNode* CreatBitTree()  { char ch; BTNode *b; scanf("%c", &ch); /* 遇到空节点停止递归 */ if (ch == '#') {b = NULL; } else {  b = (BTNode*) malloc(sizeof(BTNode)); /* 建立根节点 */ b->data = ch; /* 递归先序建立左子树 */b->lchild = CreatBitTree(); /* 递归先序建立右子树 */ b->rchild = CreatBitTree();} return b; }    /* 非递归前序遍历二叉树 */ void PreOrder(BTNode* b) { BTNode *stack[MAXSIZE], *p; int top = -1; if (b != NULL) { /* 根节点入栈 */ top++; stack[top] = b; /* 栈不空时循环 */ while (top > -1) { /* 出栈并访问该节点 */ p = stack[top]; top--; printf("%c ", p->data); /* 右孩子入栈 */ if (p->rchild != NULL) { top++; stack[top] = p->rchild; } /* 左孩子入栈 */ if (p->lchild != NULL){ top++; stack[top] = p->lchild; } } printf("/n"); } }   /* 非递归中序遍历二叉树 */ void InOrder(BTNode* b) { BTNode *stack[MAXSIZE], *p; int top = -1; if (b != NULL)          {           p = b;           while (top > -1 || p != NULL)           { /* 扫描p的所有左节点并入栈 */                while (p != NULL)                {                    top++;                    stack[top] = p;                    p = p->lchild;                }                if (top > -1)                { /* 出栈并访问该节点 */  p = stack[top];  top--; printf("%c ", p->data);  /* 扫描p的右孩子 */  p = p->rchild;                }           }           printf("/n");    } }   /* 非递归后序遍历二叉树 */ void PostOrder(BTNode* b) { BTNode *stack[MAXSIZE], *p; int sign, top = -1; if (b != NULL) { do { /* b所有左节点入栈 */ while (b != NULL) {top++; stack[top] = b; b = b->lchild; } /* p指向栈顶前一个已访问节点 */ p = NULL; /* 置b为已访问 */ sign = 1; while (top != -1 && sign) { /* 取出栈顶节点 */ b = stack[top]; /* 右孩子不存在或右孩子已访问则访问b */ if (b->rchild == p) {printf("%c ", b->data); top--; /* p指向被访问的节点 */ p = b; } else {   /* b指向右孩子节点 */ b = b->rchild;  /* 置未访问标记 */ sign = 0; } } }while (top != -1); printf("/n"); }}

热点排行
Bad Request.