分析:中序非递归遍历相比递归来说写起来会麻烦一些,主要是利用栈的思想进行入栈和出栈。
-
树
typedef struct BinNode{
char data;
struct BinNode *lchild,*rchild;
}BinNode,*BinTree;
-
栈
typedef struct{
ElemType elem[MAXSIZE];
int top;
}Stack;
-
先序遍历创建树
//先序创建树
void CreateBinTree(BinTree *T){
char ch;
if((ch=getchar())=='#') (*T)=NULL;
else{
(*T)=(BinTree)malloc(sizeof(BinNode));
(*T)->data=ch;
CreateBinTree((BinTree *)&((*T)->lchild));
CreateBinTree((BinTree *)&((*T)->rchild));
}
}
-
栈的一系列操作
//初始化栈
void CreateStack(Stack *s){
s->top=0;
}
//入栈
void Push(Stack *s,ElemType e){
if (s==NULL || e==NULL) return;
if(s->top==MAXSIZE) return;//栈顶指针为MAXSIZE时,栈满
s->elem[s->top++]=e;//将元素放入栈顶位置
}
//出栈
ElemType Pop(Stack *s){
if(s==NULL || s->top==0) return 0;//栈空
ElemType e=s->elem[--s->top];//栈顶指针下移
return e;
}
//判断栈空
int StackEmpty(Stack s){
if(s.top==0) return 1;//栈空返回1
return 0;
}
-
中序非递归算法
//中序非递归遍历
int InOrderTraverse(BinTree T){
Stack s;
int n=0;//结点计数器
CreateStack(&s);
BinTree p=T;
BinTree q=(BinTree)malloc(sizeof(BinNode));
while(p||!StackEmpty(s)){//树不空或者栈不空
if(p){
Push(&s,p);//树不空则进栈
p=p->lchild;//左子树
}
else{//树空则出栈
q=Pop(&s);
n++;//结点+1
p=q->rchild;//右子树
}
}
return n;
}
-
完整代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100
typedef struct BinNode{
char data;
struct BinNode *lchild,*rchild;
}BinNode,*BinTree;
typedef BinTree ElemType; //把栈的元素定义为树
typedef struct{
ElemType elem[MAXSIZE];
int top;
}Stack;
//先序创建树
void CreateBinTree(BinTree *T){
char ch;
if((ch=getchar())=='#') (*T)=NULL;
else{
(*T)=(BinTree)malloc(sizeof(BinNode));
(*T)->data=ch;
CreateBinTree((BinTree *)&((*T)->lchild));
CreateBinTree((BinTree *)&((*T)->rchild));
}
}
//初始化栈
void CreateStack(Stack *s){
s->top=0;
}
//入栈
void Push(Stack *s,ElemType e){
if (s==NULL || e==NULL) return;
if(s->top==MAXSIZE) return;//栈顶指针为MAXSIZE时,栈满
s->elem[s->top++]=e;//将元素放入栈顶位置
}
//出栈
ElemType Pop(Stack *s){
if(s==NULL || s->top==0) return 0;//栈空
ElemType e=s->elem[--s->top];//栈顶指针下移
return e;
}
//判断栈空
int StackEmpty(Stack s){
if(s.top==0) return 1;//栈空返回1
return 0;
}
//中序非递归遍历
int InOrderTraverse(BinTree T){
Stack s;
int n=0;//结点计数器
CreateStack(&s);
BinTree p=T;
BinTree q=(BinTree)malloc(sizeof(BinNode));
while(p||!StackEmpty(s)){//树不空或者栈不空
if(p){
Push(&s,p);//树不空则进栈
p=p->lchild;//左子树
}
else{//树空则出栈
q=Pop(&s);
n++;//结点+1
p=q->rchild;//右子树
}
}
return n;
}
int main(){
BinTree T;
CreateBinTree((BinTree*)&T);
int n=InOrderTraverse(T);
printf("二叉树的结点个数为:%d\n",n);
return 0;
}