C++非递归后序遍历

#include<iostream>
#include<stdlib.h> 
#include<stack>  //插入标准库中的头文件
using namespace std;

typedef struct treenode {
	char data;
	treenode *rchild;
	treenode *lchild;
}*Node;

typedef struct snode {  //作为右节点是否被访问过
	Node p;
	int visited;
};

//创建二叉树
void creat_tree(Node &rt)
{
	char ch;
	ch = getchar();
	if ('#' == ch) {
		rt = NULL;
	}
	else {
		rt = new treenode;
		rt->data = ch;
		creat_tree(rt->lchild);        //构造左子树
		creat_tree(rt->rchild);    //构造右子树    
	}
}

//非递归后序遍历
void Non_rec__traversal(Node root) {  
	Node temp = root;  
	stack <snode> S;  //初始化栈
	while (temp) {  //寻找最左边的结点
		snode a;
		a.p = temp;
		a.visited = 0;
		S.push(a);
		temp = temp->lchild;
	}

	while (!S.empty()) {  //当栈非空时
		snode b = S.top();  //获得栈顶元素
		if (b.p->rchild == NULL || b.visited) { //右节点为空或者右节点已被访问过
			cout << S.top().p->data << " ";  //输出结点值
			S.pop();  //出栈
		}
		else {  //右节点非空并且没被访问
			S.top().visited = 1;  //注意这里不能写b,必须写S.top(),否则会出现错误
			temp = b.p->rchild;
			while (temp) {   //继续寻找最左边的结点
				snode n;
				n.p = temp;
				n.visited = 0;
				S.push(n);
				temp = temp->lchild;
			}
		}
	}
}

int main() {
	treenode *root = NULL;
	cout << "请输入二叉树,空值以#代表:" << endl;
	creat_tree(root);        //创建二叉树

	Non_rec__traversal(root);

	system("pause");
	return 0;
}

/*
如果想实现反序输出,只需要在这里添加一个栈就可以实现了。
*/

/*
ABD##E##C#F##
*/


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值