非递归遍历二叉树

非递归遍历二叉树

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值