【数据结构】中序遍历非递归算法

基本思想:

(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;
} 

运行结果:

【数据结构】中序遍历非递归算法_第1张图片

 

你可能感兴趣的:(c++,数据结构(c++),数据结构,c++)