码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构-二叉树的各种遍历(先中后层序!!)

时间:2014-11-28 10:16:15      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:二叉树   数据结构   遍历   结构   acm   


最近在写数据结构中二叉树的遍历,这里总结一下:


先序递归遍历:

void PreTravel(BiTree T)
{//前序递归遍历
	if(T)
	{  
		printf("%c",T->data);
		PreTravel(T->lchild);
		PreTravel(T->rchild);
	}
}


中序递归遍历:

void MidTravel(BiTree T)
{//中序递归遍历
	if(T)
	{  
		MidTravel(T->lchild);
		printf("%c",T->data);
		MidTravel(T->rchild);
	}
}


后序递归遍历:

void PostTravel(BiTree T)
{//后序递归遍历
	if(T)
	{  
		PostTravel(T->lchild);
		PostTravel(T->rchild);
		printf("%c",T->data);
	}
}


先序非递归遍历:

void PreOrder(BiTree &T)
{//先序非递归遍历 
	stack<BiTree> s;
	BiTree p = T;
	while(p || !s.empty())
	{
		if(p)
		{
			printf("%c", p->data);
			s.push(p);
			p = p->lchild;
		}
		else
		{
			p = s.top();
			s.pop();
			p = p->rchild;
		} 
	}
} 


中序非递归遍历:

void InOrder(BiTree T)
{//中序非递归遍历 
	stack<BiTree> s;
	BiTree p = T;
	while(p || !s.empty())
	{
		if(p)
		{
			s.push(p);
			p = p->lchild;
		}
		else 
		{
			p = s.top();
			printf("%c", p->data);
			s.pop();
			p = p->rchild;
		}
	}
} 


后序非递归遍历:

void PostOrder(BiTree &T)
{//后序非递归遍历(加入一个标志变量visit,判断左右子树是否进栈) 
	stack<BiTree> s;
	BiTree p = T;
	p->visit = false;
	if(T) s.push(T);
	while(!s.empty())
	{
		p = s.top();
		if(p->visit)
		{
			printf("%c", p->data);
			s.pop();
		}
		else 
		{
			if(p->rchild)
			{
				p->rchild->visit = false;
				s.push(p->rchild);
			}
			if(p->lchild)
			{
				p->lchild->visit = false;
				s.push(p->lchild);
			}
			p->visit = true;
		}
	}
}


void PostOrder1(BiTree &T)
{//后序非递归遍历 (销毁了树的结构,不可取)
	stack<BiTree> s;
	BiTree q, p = T;
	while(p || !s.empty())
	{
		if(p)
		{
			s.push(p);
			q = p;
			p = q->lchild;
			q->lchild = NULL;
		}
		else 
		{
			q = s.top();
			p = q->rchild;
			q->rchild = NULL;
			if(p)
			{
				s.push(p);
				q = p;
				p = q->lchild;
				q->lchild = NULL;
			}
			else 
			{
				p = s.top();
				printf("%c", p->data);
				s.pop();
				if(!s.empty())
				{
					p = s.top();
					p = p->lchild;
				}
				else return;
			}
		}
	}	
} 


层序遍历:

void LevelOrder(BiTree &T)
{//层序遍历 
	queue<BiTree> q;
	q.push(T);
	BiTree p;
	while(!q.empty())
	{
		p = q.front();
		printf("%c", p->data);
		q.pop();
		if(p->lchild)
			q.push(p->lchild);
		if(p->rchild)
			q.push(p->rchild);
	}
}


主函数调用:


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <stack>
#include <queue>
#include "constant.h"
using namespace std;

typedef struct BiTNode
{
	char data;
	bool visit; 
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void Print(char a)
{
	printf("%c", a);
	return;
}

void CreatBiTree(BiTree &T)
{//前序法创建二叉树
	char ch;
	if((ch=getchar())=='#')
		T=NULL;
	else
	{
		T=(BiTNode*)malloc(sizeof(BiTNode));
		if(!T)
			exit(1);
		T->data=ch;
		CreatBiTree(T->lchild);
		CreatBiTree(T->rchild);
	}
}

void PreTravel(BiTree T)
{//前序递归遍历
	if(T)
	{  
		printf("%c",T->data);
		PreTravel(T->lchild);
		PreTravel(T->rchild);
	}
}

void MidTravel(BiTree T)
{//中序递归遍历
	if(T)
	{  
		MidTravel(T->lchild);
		printf("%c",T->data);
		MidTravel(T->rchild);
	}
}

void PostTravel(BiTree T)
{//后序递归遍历
	if(T)
	{  
		PostTravel(T->lchild);
		PostTravel(T->rchild);
		printf("%c",T->data);
	}
}

void PreOrder(BiTree &T)
{//先序非递归遍历 
	stack<BiTree> s;
	BiTree p = T;
	while(p || !s.empty())
	{
		if(p)
		{
			printf("%c", p->data);
			s.push(p);
			p = p->lchild;
		}
		else
		{
			p = s.top();
			s.pop();
			p = p->rchild;
		} 
	}
} 

void InOrder(BiTree T)
{//中序非递归遍历 
	stack<BiTree> s;
	BiTree p = T;
	while(p || !s.empty())
	{
		if(p)
		{
			s.push(p);
			p = p->lchild;
		}
		else 
		{
			p = s.top();
			printf("%c", p->data);
			s.pop();
			p = p->rchild;
		}
	}
} 

void PostOrder(BiTree &T)
{//后序非递归遍历(加入一个标志变量visit,判断左右子树是否进栈) 
	stack<BiTree> s;
	BiTree p = T;
	p->visit = false;
	if(T) s.push(T);
	while(!s.empty())
	{
		p = s.top();
		if(p->visit)
		{
			printf("%c", p->data);
			s.pop();
		}
		else 
		{
			if(p->rchild)
			{
				p->rchild->visit = false;
				s.push(p->rchild);
			}
			if(p->lchild)
			{
				p->lchild->visit = false;
				s.push(p->lchild);
			}
			p->visit = true;
		}
	}
}

void PostOrder1(BiTree &T)
{//后序非递归遍历 (销毁了树的结构,不可取)
	stack<BiTree> s;
	BiTree q, p = T;
	while(p || !s.empty())
	{
		if(p)
		{
			s.push(p);
			q = p;
			p = q->lchild;
			q->lchild = NULL;
		}
		else 
		{
			q = s.top();
			p = q->rchild;
			q->rchild = NULL;
			if(p)
			{
				s.push(p);
				q = p;
				p = q->lchild;
				q->lchild = NULL;
			}
			else 
			{
				p = s.top();
				printf("%c", p->data);
				s.pop();
				if(!s.empty())
				{
					p = s.top();
					p = p->lchild;
				}
				else return;
			}
		}
	}	
} 

void LevelOrder(BiTree &T)
{//层序遍历 
	queue<BiTree> q;
	q.push(T);
	BiTree p;
	while(!q.empty())
	{
		p = q.front();
		printf("%c", p->data);
		q.pop();
		if(p->lchild)
			q.push(p->lchild);
		if(p->rchild)
			q.push(p->rchild);
	}
}

int main()
{ 
	BiTree T;
	printf("please input the bitree:\n" );
    CreatBiTree(T);
	printf("The Pretravel is:\n");
	PreTravel(T);
	printf("\n");
	PreOrder(T);
	printf("\n");
	printf("The Midtravel is:\n");
	MidTravel(T);
	printf("\n");
	InOrder(T);
	printf("\n");
	printf("The PostTravel is:\n");
	PostTravel(T);
	printf("\n");
	PostOrder(T);
	printf("\n");
	printf("The LevelTravel is:\n");
	LevelOrder(T);
	printf("\n");
	
	PostOrder1(T);
	printf("\n");
	return 0;
}


数据结构-二叉树的各种遍历(先中后层序!!)

标签:二叉树   数据结构   遍历   结构   acm   

原文地址:http://blog.csdn.net/u014355480/article/details/41558957

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!