給定一棵樹的先序遍歷和中序遍歷結果,從新構建這棵樹。ui
解決思路:編碼
1. 從先序遍歷序列中找到root節點spa
2. 在中序遍歷序列中找到root出現的下標位置,記爲root_iter. root_iter左邊的爲左子樹的中序遍歷序列,長度爲lTreeSize, 右邊爲右子樹的中序遍歷序列。code
3. 先序遍歷序列中,除了第一個元素root節點,剩下的lTreeSize個元素是左子樹的先序遍歷序列,最後剩下的就是右子樹的中序遍歷序列了。blog
4. 獲得左右子樹的先序,中序遍歷序列後,遞歸構建左右子樹。遞歸
編碼上的坑:it
vector的迭代器的end指向容器中最後一個元素的後一位,爲一虛擬元素。左子樹遞歸下標更新時須要注意。io
1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 11 typedef vector<int>::iterator ITER; 12 13 class Solution { 14 public: 15 TreeNode *buildTree_helper(ITER p_start, ITER p_end, 16 ITER in_start, ITER in_end){ 17 if(p_end == p_start) 18 return NULL; 19 if(in_start == in_end) 20 return NULL; 21 TreeNode *root = new TreeNode(*p_start); 22 ITER root_iter = find(in_start, in_end, root->val); 23 int lTreeSize = root_iter-in_start; 24 root->left = buildTree_helper(p_start+1,p_start+lTreeSize+1,in_start,root_iter); 25 root->right = buildTree_helper(p_start+lTreeSize+1,p_end,root_iter+1,in_end); 26 return root; 27 } 28 29 TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) { 30 int n = preorder.size(); 31 if(n==0) 32 return NULL; 33 return buildTree_helper(preorder.begin(),preorder.end(),inorder.begin(),inorder.end()); 34 } 35 };