您的位置:首页 > Web前端

剑指offer第6题 二叉树重建 九度OJ1385

2013-05-09 16:13 260 查看
剑指offer书中有个小错误,就是在57页第9行代码,在中序遍历中找根节点的值

int* rootInorder = startInorder;
while(rootInorder <= endInorder && *rootInorder != rootvalue)
++ rootInorder;
应该改为
int* rootInorder = startInorder;
while(rootInorder < endInorder && *rootInorder != rootvalue)
++ rootInorder;

完整代码如下

//根据前序遍历和中序遍历重构二叉树
//JOBDU1385
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iterator>
#include <algorithm>
using namespace std;

struct Node
{
int value;
Node* pLeft;
Node* pRight;
};
bool bInvalidInput = false;

Node* solvecore(int* startPre,int* endPre,int* startIn,int* endIn)
{
if(bInvalidInput)
return NULL;
Node* root = new Node();
int rootvalue = startPre[0];
root->value = rootvalue;
root->pLeft = root->pRight = NULL;
if(startPre == endPre)
{
if( startIn == endIn && *startIn == *startPre)
return root;
else
{
bInvalidInput = true;
return NULL;
}
}
int* pIn = startIn;
while(*pIn != rootvalue && pIn < endIn)
++pIn;
if(*pIn != rootvalue && pIn == endIn)
{
bInvalidInput = true;
return NULL;
}
int leftLength = pIn - startIn;
int* endP = startPre + leftLength;
if(leftLength > 0)
{
root->pLeft = solvecore(startPre+1,endP,startIn,pIn-1);
if(bInvalidInput)
return NULL;
}
if(leftLength < endPre - startPre)
{
root->pRight = solvecore(endP+1,endPre,pIn+1,endIn);
if(bInvalidInput)
return NULL;
}

return root;

}
void postOrder(Node* root)
{
if(root == NULL)
return ;
if(root->pLeft != NULL)
postOrder(root->pLeft);
if(root->pRight != NULL)
postOrder(root->pRight);
cout<<root->value<<" ";
}
void solve(int preOrder[],int midOrder[],int NodeNum)
{
if(preOrder == NULL || midOrder == NULL || NodeNum <= 0)
{
cout<<"No"<<endl;
return ;
}
bInvalidInput = false;
Node* root = solvecore(preOrder,preOrder + NodeNum -1,midOrder,midOrder + NodeNum -1);

if(root != NULL && !bInvalidInput)
{
postOrder(root);
cout<<endl;
}
else
cout<<"No"<<endl;
}

int main()
{
//freopen("6.txt","r",stdin);
const int Max_Num = 1005;
int preOrder[Max_Num],midOrder[Max_Num];
int NodeNum;
while(cin>>NodeNum)
{
memset(preOrder,0,sizeof(preOrder));
memset(midOrder,0,sizeof(midOrder));
int i;
for(i = 0;i < NodeNum ;i++)
cin>>preOrder[i];
for(i = 0;i < NodeNum ;i++)
cin>>midOrder[i];
solve(preOrder,midOrder,NodeNum);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: