【剑指07】重建二叉树

方法一:递归:时间O(n),空间O(n)

在这里插入图片描述

题解:

  1. 根据先序中的索引,找到中序中的对应位置k
  2. 建立节点,划分k位置之前是节点的左树,k位置之后是节点的右树
  3. 结束条件:索引到头 或者 left == right
  4. 这里用了一个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()); 
    }
};

猜你喜欢

转载自blog.csdn.net/qq_45691748/article/details/112408608