您的位置:首页 > 其它

已知先序遍历和中序遍历求后序遍历——二叉树

2011-08-23 16:25 357 查看
思想数据结构课都讲过,就是从pre下手,因为处理pre是连续的一段段,头上的都是根节点,所以接口函数为:

void solve(tree* root,int low,int high,int rootpos)

root为当前节点,low,high都是相对于mid串而言的;rootpos为根节点在pre串中的位置

思路递归,代码如下:

#include "iostream"
#include "string"
using namespace std;

struct tree
{
	char name;
	tree* left;
	tree* right;
};
string pre,mid;

//tree* solve(tree* root,int low,int high,int rootpos)
//{
//	if (low>high)
//		return NULL;
//	if(low==high)
//	{
//		tree *temp=(tree*) malloc(sizeof(tree*));
//		temp->left=temp->right=NULL;
//		temp->name=mid[low];
//		return temp;
//	}
//	int rpos=-1;
//	while (mid[++rpos]!=pre[rootpos]);
//	root->name=pre[rootpos];
//	root->left=(tree*) malloc(sizeof(tree*));
//	root->right=(tree*) malloc(sizeof(tree*));
//	root->left=solve(root->left,low,rpos-1,rootpos+1);
//	root->right=solve(root->right,rpos+1,high,rpos+1);
//	return root;
//}

void solve(tree* root,int low,int high,int rootpos)
{
	if(low==high)
	{
		root->left=root->right=NULL;
		root->name=mid[low];
		return;
	}
	int rpos=-1;
	while (mid[++rpos]!=pre[rootpos]);
	root->name=pre[rootpos];
	root->left=root->right=NULL;
	if (low<=rpos-1)
	{
		root->left=(tree*) malloc(sizeof(tree*));
		solve(root->left,low,rpos-1,rootpos+1);
	}
	if(rpos+1<=high)
	{
		root->right=(tree*) malloc(sizeof(tree*));
		solve(root->right,rpos+1,high,rpos+1);
	}
}

void TraversalPost(tree* node)
{
	if (node)
	{
		TraversalPost(node->left);
		TraversalPost(node->right);
		printf("%c ",node->name);
	}
}

void main()
{
	int i,j;
	tree* root=(tree*)malloc(sizeof(tree*));
	while (cin>>pre>>mid)
	{
		root->left=root->right=NULL;
		root->name=mid[0];
		solve(root,0,mid.length()-1,0);
		TraversalPost(root);
		cout<<endl;
	}
}


其中被注释掉的那部分也能用的,和下面同名函数是同种方法,两种形式。

调用就是root=solve(root,0,mid,length()-1,0);

=======================================================================

Hope you enjoy it !
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐