非递归遍历二叉树
创建一个顺序栈,用栈来辅助实现二叉树的前序递归。
前序遍历访问顺序即先访问根,再左,最后右。先让根结点入栈,每次入栈一个元素,然后输出它。循环至到达二叉树最左结点,即遍历指针至向左边最后一个结点,然后出栈。每次出栈一个元素,然后将遍历指针指向该元素的右孩子,如果存在,再遍历至指针指向最左结点。若不存在右子树,继续出栈一个元素,找该元素的右子树,重复操作。
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 100
typedef char Elem; //定义数据类型
typedef int Status;
//定义二叉树
typedef struct BiTree{
Elem data;
struct BiTree* lchild;
struct BiTree* rchild;
}BiTNode,* BiTree;
//定义栈
typedef struct SqStack{
BiTree base;
BiTree top;
int stacksize;
}SqStack;
//初始化栈
Status InitStack(SqStack* S){
(*S).base=(BiTNode*)malloc(sizeof(BiTNode)*MAXSIZE);
if (!(*S).base)
return OVERFLOW;
(*S).top=(*S).base;
(*S).stacksize=MAXSIZE;
return OK;
}
//获取栈顶元素
Status GetTop(SqStack S,BiTree e){
if(S.top==S.base) //栈空则返回错误
return ERROR;
*e=*(S.top-1);
return OK;
}
Status StackEmpty(SqStack S){//判空
if (S.base==S.top)
return TRUE;
else
return FALSE;
}
Status CreatBiTree(BiTree* root) {//构造二叉树
char c;
scanf("%c",&c);
if(c=='#')
*root=NULL;
else{
*root = (BiTree)malloc(sizeof(BiTNode));
if(!(*root)){
printf("\n内存分配失败\n");
return OVERFLOW;
}
(*root)->data=c;
CreatBiTree(&(*root)->lchild);
CreatBiTree(&(*root)->rchild);
}
return OK;
}
Status PreOrderTraverse(BiTree T){
if(T!=NULL){ //判断根结点是否为空
BiTNode* Stack[MAXSIZE];
int top=-1; //初始化栈
BiTNode* p=NULL; //遍历指针
Stack[++top]=T; //节点入栈
while (top!=-1) //栈空停止循环
{
p=Stack[top--];
printf("%c",p->data); //输出元素
if(p->rchild!=NULL) //右孩子不为空就入栈
Stack[++top] = p->rchild;
if(p->lchild!=NULL) //左孩子不为空就入栈
Stack[++top]=p->lchild;
}
}
return OK;
}
void main() {
BiTree Tree;
printf("输入二叉树:\n");
CreatBiTree(&Tree);
PreOrderTraverse(Tree);
printf("\n");
}
总结
循环条件要设置正确,否则会
设置遍历指针:BiTNode* p=NULL;