#pragma warning(disable:4996)
#include<cstdio>
#include<cstdlib>
typedef struct BiTNode {
char data;
struct BiTNode *lchild, *rchild;//左右孩子指针
}BiTNode,*BiTree;
bool CreateBiTree(BiTree &T) {
//按先序次序输入二叉树中结点的值(一个字符),圆点字符表示空树,
//构造二叉链表示的二叉树T
char ch;
scanf("%c", &ch);
if (ch == '.') T = NULL;
else {
//printf("%c\n", ch);
if (!(T = (BiTNode*)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data = ch; //生成根节点
CreateBiTree(T->lchild); //构造左子树
CreateBiTree(T->rchild); //构造右子树
}
return 1;
}//CreatBiTree
typedef struct Snode {
BiTree data;
struct Snode *next;
}Snode, *LinkStack;
int InitStack(LinkStack &S) {
//创建一个空链栈
S = NULL;
return 1;
}
bool Push(LinkStack &S, BiTree e) //在栈顶插入元素e
{
LinkStack p;
p = (LinkStack)malloc(sizeof(Snode)); //生成新结点
p->data = e; //将e放在新结点数据域
p->next = S; //将新结点的指针域指向S,即将S的地址赋值给新结点的指针域
S = p; //修改栈顶指针为p
return true;
}
bool Pop(LinkStack &S, BiTree &e) //删除S的栈顶元素,用e保存其值
{
LinkStack p;
if (S == NULL) //栈空
return false;
e = S->data; //将栈顶元素赋给e
p = S; //用p保存栈顶元素地址,以备释放
S = S->next; //修改栈顶指针,指向下一个结点
free(p); //释放原栈顶元素的空间
return true;
}
bool StackEmpty(LinkStack S) {
//判断栈是否为空
if (S == NULL)return 1;//栈空
return 0;
}
bool Visit(char e){
//打印参数
printf("%c", e);
return 1;
}
bool PostOrderTraverse(BiTree T, bool ( * Visit)(char e)) {
//后序遍历二叉树T的非递归算法,对每个数据元素调用函数Visit
LinkStack s1,s2;//s1向上回溯,s2保存数据
InitStack(s1); InitStack(s2);//初始化栈
BiTree p = T;
while (p||!StackEmpty(s1))
{
while (p)
{
Push(s1, p);//P进栈,遍历右子树
Push(s2, p);
p = p->rchild;
}
Pop(s1, p);
p = p->lchild;
}
while (!StackEmpty(s2)) {
Pop(s2, p);
if (!Visit(p->data))return 0;
}
return 1;
}
int main() {
BiTree tree;
printf("按先序次序输入二叉树中结点的值(一个字符),圆点字符表示空树:\n");
CreateBiTree(tree);
PostOrderTraverse(tree, Visit);
printf("\n");
system("pause");
return 0;
}
测试数据:
ABD...CE..F..
DBEFCA
A.BCHI.J...D..E.FG...
JIHDCGFEBA
AB.CD...E.FGH..K...
DCBHKGFEA