文章目录
方法一:递归:时间O(n),空间O(n)
题解:
- 根据先序中的索引,找到中序中的对应位置k
- 建立节点,划分k位置之前是节点的左树,k位置之后是节点的右树
- 结束条件:索引到头 或者 left == right
- 这里用了一个map键值对保存中序的值和索引,map的查找时间复杂度为O(1)
class Solution {
public:
int index = 0; // 先序的索引
unordered_map<int, int> board; // 用来保存中序的值和索引
TreeNode* build(vector<int>& preorder, int left, int right)
{
if (index == preorder.size() || left == right)
return NULL;
int pos = board[preorder[index]];
TreeNode* root = new TreeNode(preorder[index]);
index++;
root->left = build(preorder, left, pos);
root->right = build(preorder, pos + 1, right);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
if (preorder.size() == 0)
return NULL;
// 保存中序的键值对
for (int i = 0; i < inorder.size(); i++)
{
board[inorder[i]] = i;
}
return build(preorder, 0, preorder.size());
}
};