108. 将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

class Solution {
  TreeNode *Dispatch(vector<int> &V, int L, int R) {
    if (L == R)
      return {};
    int M = (L + R) / 2;
    TreeNode *Root = new TreeNode(V[M], Dispatch(V, L, M),
                                  Dispatch(V, M + 1, R));
    return Root;
  }
public:
  TreeNode* sortedArrayToBST(vector<int>& nums) {
    return Dispatch(nums, 0, nums.size());
  }
};

这题其实是一个二分问题。对数组进行二分之后左右元素数量的最大差值是不超过 1 的,顶多就是一奇一偶,所以构造出来的树自然也就是平衡的。

二刷

class Solution {
  TreeNode *Build(vector<int> &nums, int L, int R) {
    if (L == R)
      return nullptr;

    int M = L + (R - L) / 2;
    TreeNode *TN = new TreeNode(nums[M]);
    TN->left = Build(nums, L, M);
    TN->right = Build(nums, M + 1, R);
    return TN;
  }
public:
  TreeNode* sortedArrayToBST(vector<int>& nums) {
    return Build(nums, 0, nums.size());
  }
};

跟一刷差不多,思路非常清晰。