#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##
*/
C++非递归后序遍历
最新推荐文章于 2024-03-19 09:17:45 发布