二叉树后序遍历(非递归算法)
来源:互联网 发布:纽约 知乎 编辑:程序博客网 时间:2024/06/07 18:39
#include <stdio.h>#include <stdlib.h>#define OVERFLOW -2#define MAX 200/* 定义二叉树结点类型 */typedef struct BTNode{ char data; struct BTNode* lchild, *rchild;} BTNode;/* 递归先序建立二叉树 */voidCreate_BT(BTNode* & T){ char ch; scanf("%c", &ch); if (ch == '#') T = NULL; else { T = (BTNode*)malloc(sizeof(BTNode)); if (!T) exit(OVERFLOW); T->data = ch; Create_BT(T->lchild); Create_BT(T->rchild); }}/* 非递归后序遍历二叉树 */voidPostOrder_Nonrecursive(BTNode *T){ BTNode *St[MAX]; BTNode *p; // p指向栈顶结点的前一个已访问的结点 int flag, top = -1; if (T != NULL) { do { while (T != NULL) /* 将*T的所有左结点入栈 */ { top++; St[top] = T; T = T->lchild; } p = NULL; flag = 1; // 设置T的访问标记为已访问过 while (top != -1 && flag) // 栈不空且flag == 1 { T = St[top]; // 取出当前的栈顶元素 if (T->rchild == p) /* 右孩子不存在或右孩子已被访问,则访问*T */ { printf("%c ", T->data); top--; p = T; /* p指向被访问的结点 */ } else { T = T->rchild; /* T指向右孩子结点 */ flag = 0; /* 设置未被访问的标记 */ } } } while (top != -1); printf("\n"); }}/* 主函数 */int main(){ BTNode *T; printf("请将二叉树中的结点按从上到下从到右的次序输入:\n"); Create_BT(T); printf("\n非递归实现的二叉树的中序遍历结果是:\n"); PostOrder_Nonrecursive(T); return 0;}