基本思想:
(1)建立一个栈
(2)根结点进栈,遍历左子树
(3)根结点出栈,输出根结点,遍历右子树
#include
using namespace std;
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//初始化二叉树
void InitBiTree(BiTree &T){
T=NULL;
}
//创建二叉树
void CreateBiTree(BiTree &T){
char data;
cin>>data;
if(data!='#'){
T=new BiTNode;
T->data=data;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
else T=NULL;
}
//栈
#define MAXSIZE 100
typedef struct{
BiTree *base;
BiTree *top;
int stacksize;
}SqStack;
//初始化栈
void InitStack(SqStack &S){
S.base=new BiTree[MAXSIZE];
if(!S.base) exit(1); //分配失败
S.top=S.base;
S.stacksize=MAXSIZE;
}
//判断是否为空
int StackEmpty(SqStack S){
if(S.top==S.base) return 1; //栈顶等于栈底,为空
else return 0;
}
//入栈
int Push(SqStack &S,BiTree e){
if(S.top-S.base==MAXSIZE) return 0; //栈满,上溢
*S.top=e;
S.top++;
return 1;
}
//出栈
int Pop(SqStack &S,BiTree &e){
if(StackEmpty(S)) return 0; //栈空,下溢
S.top--;
e=*S.top;
return 1;
}
//中序遍历的非递归算法
int InOrderTraverse(BiTree T){
SqStack S;
InitStack(S);
// BiTNode *p=T; //另一种写法
// BiTNode *q=new BiTNode;
BiTree p=T; //p指针遍历,初始指向根节点
BiTree q=new BiTNode; //新建q,用来存放出栈元素
while(p||!StackEmpty(S)){
if(p){
Push(S,p); //入栈
p=p->lchild; //左子树
}
else{
Pop(S,q); //出栈
cout<data<<' '; //输出根节点
p=q->rchild; //右子树
}
}
return 1;
}
int main(){
BiTree T;
InitBiTree(T);
cout<<"请输入元素:";
CreateBiTree(T);
cout<<"中序遍历(非递归)结果为:";
InOrderTraverse(T);
return 1;
}
运行结果: