非递归遍历二叉树

非递归遍历二叉树

创建一个顺序栈,用栈来辅助实现二叉树的前序递归。
前序遍历访问顺序即先访问根,再左,最后右。先让根结点入栈,每次入栈一个元素,然后输出它。循环至到达二叉树最左结点,即遍历指针至向左边最后一个结点,然后出栈。每次出栈一个元素,然后将遍历指针指向该元素的右孩子,如果存在,再遍历至指针指向最左结点。若不存在右子树,继续出栈一个元素,找该元素的右子树,重复操作。

#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;

上一篇:python脚本调用python脚本和shell脚本并传参,接收参数并转成传参时的数据类型


下一篇:数据结构课之二叉树的递归操作