非遞歸二叉樹

<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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章