现在的位置: 首页 > 综合 > 正文

二叉树的各种遍历

2017年10月17日 ⁄ 综合 ⁄ 共 2933字 ⁄ 字号 评论关闭
#include <iostream>
#include <stack>
#include <queue>
#include <utility>
#include <assert.h>
using namespace std;


typedef struct node
{
	char data;
	node *left;
	node *right;
}BiNode,*BiTree;


int CreateBiTreeByPreAndMid(BiTree &root,char *front,char *middle,int len)
{
	assert(len!=0);
	root->data=front[0];
	int i;
	for(i=0;i<len;i++)
	{
		if(middle[i]==root->data)
			break;
	}
	if(i!=0)
	{
		root->left=new BiNode;
		CreateBiTreeByPreAndMid(root->left,front+1,middle,i);
	}
	else
		root->left=NULL;
	if(i!=len-1)
	{
		root->right=new BiNode;
		CreateBiTreeByPreAndMid(root->right,front+i+1,middle+i+1,len-i-1);
	}
	else
		root->right=NULL;
	return 1;
}


int CreateBiTreeByMidAndPost(BiTree &t,char *midOrder,char*postOrder,int len)
{
	assert(len!=0);
	t->data=postOrder[len-1];
	int i;
	for(i=0;i<len;i++)
	{
		if(midOrder[i]==t->data)
			break;
	}
	if(i!=0)
	{
		t->left=new BiNode;
		CreateBiTreeByMidAndPost(t->left,midOrder,postOrder,i);
	}
	else
		t->left=NULL;
	if(i!=len-1)
	{
		t->right=new BiNode;
		CreateBiTreeByMidAndPost(t->right,midOrder+i+1,postOrder+i,len-i-1);
	}
	else
		t->right=NULL;
	return 1;
 }


void Visit(BiNode &binode)
{
	cout<<binode.data;
}


void PreOrder(BiTree &t)
{
	stack<BiNode*> s;
	BiNode *p=t;
	if(p==NULL)
		return;
	s.push(p);
	while(!s.empty())
	{
		p=s.top();
		Visit(*p);
		s.pop();
		if(p->right)
			s.push(p->right);
		if(p->left)
			s.push(p->left);
	}
}


void PreOrder2(BiTree &t)
{
	stack<BiNode*> s;
	BiNode *p=t;
	while(p!=NULL || !s.empty())
	{
		while(p!=NULL)
		{
			Visit(*p);
			s.push(p);
			p=p->left;
		}
		if(!s.empty())
		{
			p=s.top();
			s.pop();
			p=p->right;
		}
	}
}


void MidOrder(BiTree &t)
{
	stack< pair<BiNode*,int> >s;
	int unUsed;
	BiNode*p=t;
	s.push(make_pair(p,1));
	while(!s.empty())
	{
		p=s.top().first;
		unUsed=s.top().second;
		s.pop();
		if(unUsed)
		{
			if(p->right)
				s.push(make_pair(p->right,1));
			s.push(make_pair(p,0));
			if(p->left)
				s.push(make_pair(p->left,1));
		}
		else
		{
			Visit(*p);
		}
	}
}


void MidOrder2(BiTree &t)
{
	stack<BiNode*>s;
	BiNode *p=t;
	while(p!=NULL || !s.empty())
	{
		while(p!=NULL)
		{
			s.push(p);
			p=p->left;
		}
		if(!s.empty())
		{
			p=s.top();
			Visit(*p);
	    	s.pop();
	    	p=p->right;
		}
	}
}


void PostOrder(BiTree &t)
{
	stack< pair<BiNode*,int> >s;
	int unUsed;
	BiNode*p=t;
	s.push(make_pair(p,1));
	while(!s.empty())
	{
		p=s.top().first;
		unUsed=s.top().second;
		s.pop();
		if(unUsed)
		{	
			s.push(make_pair(p,0));
			if(p->right)
				s.push(make_pair(p->right,1));	
			if(p->left)
				s.push(make_pair(p->left,1));	
		}
		else
		{
			Visit(*p);
		}
	}
}


void PostOrder2(BiTree &t)
{
	stack<BiNode*>s;
	BiNode*p=t,*pre=NULL;
	s.push(p);
	while(!s.empty())
	{
		p=s.top();
		if((p->left==NULL&&p->right==NULL)
			||(pre!=NULL&&(p->left==pre||p->right==pre)))
		{
			Visit(*p);
			s.pop();
			pre=p;
		}
		else
		{
			if(p->right)
				s.push(p->right);
			if(p->left)
				s.push(p->left);
		}
	}
}


void LeverOrder(BiTree &t)
{
	queue<BiNode*> q;
	BiNode *p=t;
	q.push(p);
	while(!q.empty())
	{
		p=q.front();
		Visit(*p);
		q.pop();
		if(p->left)
			q.push(p->left);
		if(p->right)
			q.push(p->right);
	}


}


int main(int argc,char *argv[])
{
	char str1[100],str2[100];
	BiTree t=new BiNode;
	freopen("PreAndMid.txt","r",stdin);
	cin>>str1>>str2;
	assert(strlen(str1)==strlen(str2));
	CreateBiTreeByPreAndMid(t,str1,str2,strlen(str1));
	PreOrder(t);
	cout<<endl;
	PreOrder2(t);
	cout<<endl;
	MidOrder(t);
	cout<<endl;
	MidOrder2(t);
	cout<<endl;
	PostOrder(t);
	cout<<endl;
	PostOrder2(t);
	cout<<endl;
	LeverOrder(t);
	cout<<endl;
	return 0;
}

抱歉!评论已关闭.