剑指offer面试题06 重建二叉树

#include<iostream>
using namespace std;
struct BTreeNode
{
	int data;
	struct BTreeNode *lchild,*rchild;
};
void PostOrder(BTreeNode *bt) 
{ 
    if(bt!=NULL) 
    { 
        PostOrder(bt->lchild); 
        PostOrder(bt->rchild); 
        printf("%d\n",bt->data); 
    } 
} 

void PreInCreate(BTreeNode *&root,int pre[100],int in[100],int start1,int end1,int start2,int end2)
{
	root=(BTreeNode*)malloc(sizeof(BTreeNode*));
	root->data=pre[start1];
	//输入序列无效
	root->lchild=root->rchild=NULL;
	if(start1==end1)
	{
		if(start2==end2&&pre[start1]==in[start2])
			return;
		else
		{ 
			throw std::exception("Invalid input.");
		}
	}
	int i;
	for(i=start2;i<=end2;i++)
	{
		if(in[i]==pre[start1])break;
	}
	if(i==start2)
	{
		root->lchild=NULL;
	}
	else 
	{
		PreInCreate(root->lchild,pre,in,start1+1,start1+(i-start2),start2,i-1);
	}
	if(i==end2)
	{
		root->rchild=NULL;
	}
	else
    {
		PreInCreate(root->rchild,pre,in,start1+(i-start2)+1,end1,i+1,end2);
	}
}
int main()
{
	int n;
	while(cin>>n)
	{
		int pre[100],in[100];
		for(int i=0;i<n;i++)
		{
			cin>>pre[i];
		}
		for(int i=0;i<n;i++)
		{
			cin>>in[i];
		}
		BTreeNode *bt=(BTreeNode*)malloc(sizeof(BTreeNode*));
		PreInCreate(bt,pre,in,0,n-1,0,n-1);
		PostOrder(bt);
	}
	return 0;
}

 

posted @ 2013-01-02 19:11  代码改变未来  阅读(225)  评论(0编辑  收藏  举报