非递归二叉树

<span style="font-size:18px;">栈中存放的为指针类型</span>
<span style="font-size:18px;">置空栈的时候要给指针所指向的地方分配空间</span>
<span style="font-size:18px;">因为栈中存放的为指针类型的地址  所以出栈是要运用二级指针  给*x 赋值</span>

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 30

typedef struct SNode
{
	char x;
	SNode *Lchild;
	SNode *Rchild;

}BiTNode,* BiTree;

typedef struct
{
	BiTNode  *data[MAXSIZE];
	int top;
}SeqStack;


SeqStack * init_SeqStack()     //置空栈
{
	SeqStack *s;
	s=(SeqStack *)malloc(sizeof(SeqStack));
	s->top=-1;
	return s;
}

int Empty_SeqStack(SeqStack *s)  //判空栈
{
	if(s->top==-1)
		return 1;
	else
		return 0;
}


int Push_SeqStack(SeqStack *s,BiTNode *p)  //入栈
{
	if(s->top==MAXSIZE-1)
		return 0;
	else
	{
		s->top++;
		s->data[s->top]=p;
		return 1;
	}
}


int Pop_SeqStack(SeqStack *s,BiTNode **x)   //出栈
{
	if(Empty_SeqStack(s))
		return 0;
	else
	{
		*x=s->data[s->top--];
		return 1;
	}
}

BiTNode * Top_SeqStack(SeqStack *s)   //取栈顶
{
	if(Empty_SeqStack(s))
		return 0;
	else 
		return (s->data[s->top]);
}


/*BiTree creatBiTree()	//有返回值的创建树  调用一级指针
{
	BiTree root;
	char ch;
	ch=getchar();
	if(ch=='#')
		root=NULL;
	else
	{
		root=(BiTree)malloc(sizeof(BiTNode));
		root->x=ch;
		root->Lchild=creatBiTree();
		root->Rchild=creatBiTree();
	}
	return root;

}
*/

void creatBiTree(BiTree *root)   //(引用二级指针 无返回值 传递的为*root的地址   相当于在这个函数中root存的
{								 //是传来root的地址  而*root则为传来的root)
	char ch;
	ch=getchar();
	if(ch=='#')
		(*root)=NULL;
	else
	{
		*root=(BiTree)malloc(sizeof(BiTNode));
		(*root)->x=ch;
		creatBiTree(&((*root)->Lchild));
		creatBiTree(&((*root)->Rchild));
	}
}



void PreOrder(BiTree root)     //先序非递归遍历二叉树
{
	SeqStack *s;
	s=init_SeqStack();
	BiTree p;
	p=root;
	while(p!=NULL||!Empty_SeqStack(s))
	{
		while(p!=NULL)
		{
			printf("%4c",p->x);
			Push_SeqStack(s,p);
			p=p->Lchild;
		}
		if(!Empty_SeqStack(s))
		{
			Pop_SeqStack(s,&p);
			p=p->Rchild;
		}
	}

}


void InOrder(BiTree root)     //中序非递归遍历二叉树
{
	SeqStack *s;
	s=init_SeqStack();
	BiTree p;
	p=root;
	while(p!=NULL||!Empty_SeqStack(s))
	{
		if(p!=NULL)
		{
			
			Push_SeqStack(s,p);
			p=p->Lchild;
		}
		else
		{
			Pop_SeqStack(s,&p);
			printf("%4c",p->x);
			p=p->Rchild;
		}
	}

}

发布了31 篇原创文章 · 获赞 9 · 访问量 14万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章