#include <stdio.h>
#include <stdlib.h>
#define OVERFLOW -2
#define MAX 200
/* 定义二叉树结点类型 */
typedef struct BTNode
{
char data;
struct BTNode* lchild, *rchild;
} BTNode;
/* 递归先序建立二叉树 */
void
Create_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);
}
}
/* 非递归后序遍历二叉树 */
void
PostOrder_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;
}
二叉树后序遍历(非递归算法)
最新推荐文章于 2021-11-15 00:58:58 发布