[剑指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; }
相关文章推荐
- 剑指offer——面试题6:重建二叉树
- 剑指offer_重建二叉树
- 剑指offer----重建二叉树---java实现
- 【剑指offer】2.3.4树——面试题6:重建二叉树
- 剑指offer 6题 【树】重建二叉树
- 剑指offer 面试题6 重建二叉树
- 剑指Offer_04_重建二叉树
- 【剑指offer】面试题6:重建二叉树
- [牛客网,剑指offer,python] 重建二叉树
- 【剑指offer】第七题:重建二叉树
- 剑指offer - 面试题6:重建二叉树
- 【剑指offer】 重建二叉树
- 剑指offer之重建二叉树
- 剑指offer---重建二叉树
- 剑指offer 重建二叉树-前序遍历和中序遍历重建
- 【剑指offer】重建二叉树
- 剑指offer面试题[6]-重建二叉树
- 剑指offer_4 重建二叉树
- 【剑指offer】先序、中序遍历结果重建二叉树
- 剑指offer-面试题6.重建二叉树