标签:io os ar sp 数据 on 代码 amp ef
最近在看数据结构 看到树这一部分。二叉树是树的最重要的一部分,而二叉树的遍历又是对二叉树进行操作最基本的部分。小弟有些懒,懒得敲代码,导致学了这么久,也没真正自己写过二叉树的遍历部分。今天不过来,大部分代码都是参考别人的。留给自己以后看
#include <iostream>
#include <stack>
#include<queue>
using namespace std;
typedef char Elemtype;
typedef struct BiNode{
	Elemtype data;
	BiNode* lchild;
	BiNode* rchild;
}BiTnode,*BiTree;
int CreatBiTree(BiTree& T)
{
	char data;
	cin>>data;
	if (data == ‘#‘)
		T = NULL;
	else
	{
		T = new BiTnode;
		T->data = data;
		CreatBiTree(T->lchild);
		CreatBiTree(T->rchild);
	}
	return 0;
}
inline void visit(BiTree T)
{
	if (T->data != ‘#‘)
		cout << T->data;
}
////递归算法进行遍历
void PreOrderTraversr(BiTree T)
{
	if (T != NULL)
	{
		visit(T);
		PreOrderTraversr(T->lchild);
		PreOrderTraversr(T->rchild);
	}	
}
void InOrderTraversr(BiTree T)
{
	if (T != NULL)
	{
		InOrderTraversr(T->lchild);
		visit(T);
		InOrderTraversr(T->rchild);
	}
}
void PosOrderTraversr(BiTree T)
{
	if (T != NULL)
	{
		PosOrderTraversr(T->lchild);
		PosOrderTraversr(T->rchild);
		visit(T);
	}
}
/////非递归遍历
void PreOrder2(BiTree T)
{
	stack<BiTree> stackBi;
	BiTree p = T;
	while (p || !stackBi.empty())
	{
		if (p)
		{
			visit(p);
			stackBi.push(p);
			p = p->lchild;
		}
		else
		{
			p = stackBi.top();
			stackBi.pop();
			p = p->rchild;
		}
	}
}
void InOrder2(BiTree T)
{
	stack<BiTree> stackBi;
	BiTree p = T;
	while(p || !stackBi.empty())
	{
		if (p)
		{
			stackBi.push(p);
			p = p->lchild;
		}
		else
		{
			p = stackBi.top();
			visit(p);
			stackBi.pop();
			p = p->rchild;
		}
	}
}
//非递归后序遍历二叉树
typedef struct BiTNodePost{  
	BiTree biTree;  
	char tag;  
}BiTNodePost,*BiTreePost;  
void PosOrder2(BiTree T)
{
	stack<BiTreePost> stackBi;
	BiTree p = T;
	BiTreePost BT;
	while(p || !stackBi.empty())
	{
		while(p)
		{
			BT = new BiTNodePost;
			BT->biTree = p;
			BT->tag = ‘L‘;
			stackBi.push(BT);
			p = p->lchild;
		}
		while (!stackBi.empty() && (stackBi.top())->tag ==‘R‘)
		{
			BT = stackBi.top();  
			//退栈  
			stackBi.pop();  
			visit(BT->biTree); 
		}
		if (!stackBi.empty())
		{
			BT = stackBi.top();
			BT->tag = ‘R‘;
			p = BT->biTree;
			p = p->rchild;
		}
		
	}
}
////层次遍历二叉树
void LevelOrder(BiTree T)
{
	BiTree p = T;
	queue<BiTree> queBi;
	if (p)
		queBi.push(p);
	while (!queBi.empty())
	{
		BiTree q = queBi.front();
		visit(q);
		queBi.pop();
		if (q->lchild)
			queBi.push(q->lchild);
		if (q->rchild)
			queBi.push(q->rchild);
	}
}
int main()
{
	BiTree T;
	CreatBiTree(T);
	cout<<"递归先序遍历:";
	PreOrderTraversr(T);
	cout<<"递归中序遍历:";
	InOrderTraversr(T);
	cout<<"递归后序遍历";
	PosOrderTraversr(T);
	cout<<endl;
	cout<<"非递归先序遍历:";
	PreOrder2(T);
	cout<<"非递归中序遍历:";
	InOrder2(T);
	cout<<"非递归后序遍历";
	PosOrder2(T);
	cout <<endl;
	cout<<"层次遍历:";
	LevelOrder(T);
	return 0;
}
标签:io os ar sp 数据 on 代码 amp ef
原文地址:http://www.cnblogs.com/niupan369/p/4057198.html