[LeetCode]Construct Binary Tree from Preorder and Inorder Traversal

給定一棵樹的先序遍歷和中序遍歷結果,從新構建這棵樹。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 };
相關文章
相關標籤/搜索