二叉树非递归后序遍历

21 篇文章 0 订阅
12 篇文章 0 订阅
#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

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gy5461

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值