题目6.38:
同6.37题条件,写出后序遍历的非递归算法(提示:为分辨后序遍历时两次进栈的不同返回点,需在指针进栈时同时将一个标志进栈)
我的下列代码并没有选择将标志进栈,而是在后序非递归的时候每个结点都有一个标志,标志判断什么时间用来回溯
若有不懂,之前的博客写的有(日期见:2020-11-16)
#include<iostream>
#include<stack>
using namespace std;
#define TElemType double
typedef struct BiTNode
{
TElemType data;
bool flag;//用于后序非递归遍历
struct BiTNode* lchild,* rchild;
}BiTNode,* BiTree;
void Creat_BiTree(BiTree& T)//递归创建二叉树
{
TElemType num;
if(cin>>num){
T=new BiTNode;
if(!T) exit(-2);
T->data=num;
Creat_BiTree(T->lchild);
Creat_BiTree(T->rchild);
}
if(!cin){
T=nullptr;
cin.clear();
cin.sync();
}
}
void PostOrder_BiTree(BiTree T)//递归先序打印二叉树
{
if(T){
PostOrder_BiTree(T->lchild);
PostOrder_BiTree(T->rchild);
cout<<T->data<<endl;
}
}
void PostOrder_UsingStack(BiTree T)//后序非递归遍历
//算法思想:先将左边的结点的flag置为true,并将结点指针存入栈中