剑指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; }
相关文章推荐
- 剑指Offer_06 根据前序遍历和中序遍历序列 重建二叉树
- 《剑指offer》(面试题6):重建二叉树
- 《剑指offer》-重建二叉树
- 《剑指Offer》学习笔记——重建二叉树
- 《剑指offer》-- (2)重建二叉树
- 《剑指Offer》面试题6 重建二叉树——勘误
- 《剑指Offer》读书笔记---面试题6:重建二叉树
- 剑指Offer----面试题六:重建二叉树
- 剑指offer_面试题6_重建二叉树(分解步骤,逐个击破)
- 《剑指offer》面试题6:重建二叉树
- 面试题06_重建二叉树——剑指offer系列
- JAVA实现重建二叉树(《剑指offer》)
- 剑指Offer面试题:5.重建二叉树
- (剑指offer)重建二叉树
- 重建二叉树(参考剑指offer)
- Java笔记---剑指Offer(一:Java实现重建二叉树)
- 剑指Offer(4)重建二叉树
- 剑指offer面试题6:重建二叉树
- (php实现剑指offer)重建二叉树
- 剑指Offer(第二版)面试题7:重建二叉树