您的位置:首页 > Web前端

[剑指offer]重建二叉树

2013-06-25 16:35 295 查看
思路:递归建树

#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <map>
using namespace std;

struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
buildPos(inorder);
return buildTree(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1);
}
TreeNode *buildTree(vector<int> &preorder, int b, int e,
vector<int> &inorder, int l, int r) {
if(b > e || l > r) return NULL;
TreeNode *root = new TreeNode(preorder[b]);
int inorderIdx = pos[preorder[b]];
if(inorderIdx < l || inorderIdx > r)
throw 1;
int preorderIdx = inorderIdx-l+b;
root->left = buildTree(preorder, b+1, preorderIdx, inorder, l, inorderIdx-1);
root->right = buildTree(preorder, preorderIdx+1, e, inorder, inorderIdx+1, r);
return root;
}
void buildPos(vector<int> &inorder)
{
for(int i = 0; i < inorder.size(); ++i)
pos[inorder[i]] = i;
}
private:
map<int, int> pos;
};

void postorderPrint(TreeNode *root)
{
if(root == NULL) return;
postorderPrint(root->left);
postorderPrint(root->right);
printf("%d ", root->val);
}

int main()
{
int n;
vector<int> preorder, inorder;
while(cin>>n)
{
preorder.resize(n);
inorder.resize(n);
for(int i = 0; i < n; ++i)
cin>>preorder[i];
for(int i = 0; i < n; ++i)
cin>>inorder[i];
try{
Solution s;
TreeNode *root = s.buildTree(preorder, inorder);
postorderPrint(root);
cout<<endl;
}
catch(...){
cout<<"No"<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: