后序遍历非递归算法的实现
这个是在前面的基础上,进行后序遍历非递归算法,这个算法是很多求二叉树路径的基础,比如求根结点到某点的路径,或求两个结点最近的公共祖先等。
代码:
#include <iostream>
#include <stdlib.h>
#define maxSize 1000
using namespace std;
typedef struct BTNode{
int data,r;
struct BTNode *lchild,*rchild;
}BTNode;
//二叉树样式
// 6
// 3 8
//2 4 7 9
//创建二叉树
bool Create(BTNode *&T, char x){
if(T==NULL){
T = (BTNode*)malloc(sizeof(BTNode));
T->data = x;
T->lchild=T->rchild=NULL;//生成结点
return true;
}
if(x<T->data)
Create(T->lchild,x);//构造左子树
else
Create(T->rchild,x);//构造右子树
}
//先序遍历二叉树
void preOrder(BTNode *p){
if(p!=NULL){
cout<<p->data;
preOrder(p->lchild);
preOrder(p->rchild);
}
}
//后序遍历非递归算法
void postOrder(BTNode *p){
BTNode *s[maxSize]={0};
int i=0;
while(p||i){
if(p){
s[++i]=p;
p=p->lchild;
}else{
p=s[i];
if(p->rchild&&p->rchild->r!=1){
p=p->rchild;
s[++i]=p;
p=p->lchild;
}else{
cout<<p->data;
i--;
p->r=1;
p=NULL;
}
}
}
}
int main()
{
int a[]={6,3,8,2,4,7,9};
struct BTNode *p=NULL;
for(int i = 0;i<7;i++)
Create(p,a[i]);
cout<<"先序遍历:";
preOrder(p);
cout<<endl<<"非递归后续遍历:";
postOrder(p);
}
测试结果: