
- 首先要明确一点,这个题是不能有重复元素的,否则就没办法做,这个易于证明
- 这个题目用递归即可,迭代炫技必要性不强
基本思想:我们从二叉树的前序第一个元素开始,即根节点,找到中序数组中,该节点的位置,即可划分左子树和右子树,然后在移动到第二个节点,即可递归的处理所有情况。
注意:
1.前序和中序的lll和rrr要分开处理,不然会逐渐错位
2.处理len时,要注意边界,比较容易错。。
cpp
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
typedef vector<int> V;
class Solution {
public:
TreeNode* dfs(V& preorder, V& inorder, int pl, int pr, int il, int ir, unordered_map<int, int>& m)
{
// printf("%d %d\n", l, r);
if(pl > pr)return nullptr;
int val = preorder[pl];
TreeNode *n = new TreeNode(val);
if(pl == pr)return n;
int mid_pos = m[val];
int len = mid_pos - il;
n->left = dfs(preorder, inorder, pl+1, pl+len, il, mid_pos-1, m);
n->right = dfs(preorder, inorder, pl+len+1, pr, mid_pos+1, ir, m);
return n;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
unordered_map<int, int> m;
int n = preorder.size();
for(int i=0;i<n;i++)
{
m[inorder[i]] = i;
}
return dfs(preorder, inorder, 0, n-1, 0, n-1, m);
}
};