数据结构与算法之各种方法遍历二叉树

搬砖以前的题目

需要复习栈与队列的小伙伴,可以到我的栈与队列文章里面搬砖

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#define MaxSize  100
using namespace std;
typedef struct node
{
	char data;
	struct node * lchild;
	struct node * rchild;
}BTNode;


typedef struct
{
	BTNode *data[MaxSize];
	int front,rear;
}SqQueue;


typedef struct
{
	BTNode *data[MaxSize];
	int top;
}SqStack;
 
void InitStack(SqStack *&s)
{
	s=(SqStack *)malloc(sizeof(SqStack));
	s->top=-1;
} 

void InitQueue(SqQueue *&q)
{	q=(SqQueue *)malloc (sizeof(SqQueue));
	q->front=q->rear=0;
}

void DestroyStack(SqStack *&s)
{
	free(s);
}
bool StackEmpty(SqStack *s)
{
	return(s->top==-1);
}
bool Push(SqStack *&s,BTNode * e)
{
	if (s->top==MaxSize-1)    
		return false;
	s->top++;
	s->data[s->top]=e;
	return true;
}

bool QueueEmpty(SqQueue *q)
{
	return(q->front==q->rear);
}

bool enQueue(SqQueue *&q,BTNode * e)
{	if ((q->rear+1)%MaxSize==q->front)	//队满上溢出
		return false;
	q->rear=(q->rear+1)%MaxSize;
	q->data[q->rear]=e;
	return true;
}
bool deQueue(SqQueue *&q,BTNode *&e)
{	if (q->front==q->rear)		//队空下溢出
		return false;
	q->front=(q->front+1)%MaxSize;
	e=q->data[q->front];
	return true;
}
bool Pop(SqStack *&s,BTNode * &e)
{
	if (s->top==-1)		
		return false;
	e=s->data[s->top];
	s->top--;
	//printf("%c\n",e);
	return true;
}  
bool GetTop(SqStack *s,BTNode *&e)
{
	if (s->top==-1) 		
		return false;
	e=s->data[s->top];
	return true;
}
void CreateBTree(BTNode *&b,char *str)// 创造二叉树 
{
	BTNode *St[MaxSize],*p;
	int top=-1,k,j=0;
	char ch;
	b=NULL;
	ch=str[j];
	while(ch!='\0')
	{
		switch(ch)
		{
			case'(':
					top++;
					St[top]=p;
					k=1;
					break;
			case')':
					top--;
					break;
			case',':
					k=2;
					break;
			default:
					p=(BTNode *)malloc(sizeof(BTNode));
					p->data = ch;
            		p->lchild = p->rchild = NULL;
			if(b==NULL)
			{
				b=p;
			}
			else
			{
				switch(k)
				{
					case 1:St[top]->lchild=p;break;
					case 2:St[top]->rchild=p;break;
				}
			}
		}
		j++;
		ch=str[j];
	}
}
void PreOrderFX(BTNode *b)    //先序遍历 非递归 
{
	BTNode *p;
	SqStack *st;
	InitStack(st);
	if(b!=NULL)
	{
		Push(st,b);
		while(!StackEmpty(st))
		{
			Pop(st,p);
			printf("%c",p->data);
			if(p->rchild !=NULL)
			{
				Push(st,p->rchild);
			}
			if(p->lchild !=NULL)
			{
				Push(st,p->lchild);
			}
		}
		printf("\n");
	}
	DestroyStack(st);
}

void InOrderFX(BTNode *b)    //中序遍历 非递归 
{
	BTNode *p;
	SqStack *st;
	InitStack(st);
	p=b;
	while(!StackEmpty(st) || p!=NULL)
	{
		while(p!=NULL)
		{
			Push(st,p);
			p=p->lchild;
		}
		if(!StackEmpty(st))
		{
			Pop(st,p);
			printf("%c",p->data);
			p=p->rchild;
		}
	}
	printf("\n");
	DestroyStack(st);
}
void PostOrderFX(BTNode *b)//后序遍历 非递归 
{
	BTNode *p,*r;
	bool flag;
	SqStack *st;
	InitStack(st);
	p=b;
	do
	{
		while(p!=NULL)
		{
			Push(st,p);
			p=p->lchild;
		}
		r=NULL;
		flag=true;
		while(!StackEmpty(st)&& flag)
		{
			GetTop(st,p);
			if(p->rchild==r)
			{
				printf("%c",p->data);
				Pop(st,p);
				r=p;
			}
			else
			{
				p=p->rchild;
				flag=false;
			}
		}
	}
	while(!StackEmpty(st));
	printf("\n");
	DestroyStack(st);
}
void PreOrder(BTNode *b)//先序遍历 递归 
{
	if(b!=NULL)
	{
		printf("%c",b->data);
		PreOrder(b->lchild);
		PreOrder(b->rchild);
	}
}
void InOrder(BTNode *b)//中序遍历 递归 
{
	if(b!=NULL)
	{
		InOrder(b->lchild);
		printf("%c",b->data);
		InOrder(b->rchild);
	}
}
void PostOrder(BTNode *b)//后序遍历 递归 
{
	if(b!=NULL)
	{
		PostOrder(b->lchild);
		PostOrder(b->rchild);
		printf("%c",b->data);
	}
}

void LevelOrder(BTNode *b)   //层次遍历 
{
	BTNode *p;
	SqQueue *qu;
	InitQueue (qu);
	enQueue(qu,b);
	while(!QueueEmpty(qu))
	{
		deQueue(qu,p);
		printf("%c",p->data);
		if(p->lchild!=NULL)
		{
			enQueue(qu,p->lchild);
		}
		if(p->rchild!=NULL)
		{
			enQueue(qu,p->rchild);
		}
	}
}

void DestroyBTree(BTNode *& b)//销毁二叉树 
{
	if(b!=NULL)
	{
		DestroyBTree(b->lchild);
		DestroyBTree(b->rchild);
		free(b);
	}
 } 


int main()
{   BTNode *b,*p;
	CreateBTree(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
	printf("先序递归"); 
	PreOrder(b);
	printf("\n");
	printf("中序递归");  
	InOrder(b);
	printf("\n");
	printf("后序递归") ;
	printf("\n");
	printf("先序非递归") ;
	PreOrderFX(b);
	printf("中序非递归");  
	InOrderFX(b);
	printf("后序非递归"); 
	PostOrderFX(b);
    printf("先序非递归") ;
	LevelOrder(b);  
    DestroyBTree(b);
    printf("\n");
    printf("二叉树已经释放"); 
}
posted @ 2019-11-09 23:32  AmosAlbert  阅读(89)  评论(0编辑  收藏  举报