二叉树(三)------先序非递归遍历

先序遍历:

算法思想:从根结点开始,若当前结点存在或不为空,可重复操作一下两步:

  (1)访问当前结点,当前结点进栈,访问其左子树,左子树不为空一直访问进栈,直到左子树为空;

(2)若栈非空,则退栈顶结点,访问其右子树。

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef char DataType;
typedef struct Node
{
	DataType data;
	struct Node * Lchild;
	struct Node * Rchild;
} BiTNode,*BiTree;
typedef BiTree DataType1; 
typedef struct
{
	DataType1 data1[MAXSIZE];
	int top;
}SeqStack;

void InitStack(SeqStack **s)//置空栈 
{
	(*s)=(SeqStack *)malloc(sizeof(SeqStack));
	(*s)->top=-1;
}
int StackEmpty(SeqStack *s)//判空栈 
{
	if(s->top==-1)
		return 1;
	else 
		return 0;
}
int Push(SeqStack *s,DataType1 x)//入栈
{
	if(s->top==MAXSIZE-1)
		return 0;
	else
	{
		s->top++;
		s->data1[s->top]=x;
		return 1;
	}	
}
int Pop(SeqStack *s,DataType1 *x)//出栈
{
	if(StackEmpty(s))	return 0;
	else
	{
		*x=s->data1[s->top];
		s->top--;
		return 1;
	}
} 

void CreateBiTree(BiTree *root)
{
	char ch;
	ch=getchar();
	if(ch=='^')
		*root=NULL;
	else
	{
		*root=(BiTree)malloc(sizeof(BiTNode));
		(*root)->data=ch;
		CreateBiTree(&((*root)->Lchild));
		CreateBiTree(&((*root)->Rchild));
	}
}
void PreOrder(BiTree root)
{
	SeqStack *S;
	BiTree p;
	InitStack(&S);
	p=root;
	while(p||!StackEmpty(S))
	{
		while(p)
		{
			printf("%c",p->data);
			Push(S,p);
			p=p->Lchild;
	    }
	    if(!StackEmpty(S))
	    {
	    	Pop(S,&p);
	    	p=p->Rchild;
		}
	}		
} 

int main(void)
{
	BiTree root;
	root=(BiTree)malloc(sizeof(BiTNode));
	CreateBiTree(&root);
	PreOrder(root);
}








扫描二维码关注公众号,回复: 2593723 查看本文章




猜你喜欢

转载自blog.csdn.net/wangkeke1996/article/details/79173964