题目:将有序数组转换为二叉搜索树

先回顾一下二叉搜索树的定义:左子树的任一节点都小于根节点,右子树的任一节点都大于根节点

现在拿到了一个有序数组,自然可以想到要从中间开始进行遍历,因此首先找到数组的中间节点,并以它作为根节点向左右进行遍历,因为数组已经有序,所以不需要再进行比较,只需要明确每一次构造的左右边界即可

至于为什么不需要考虑奇偶数组的情况,这是因为int的除法会自动向下取整,所以即使是偶数数组,也能够保证平衡(但不是对称)

 1TreeNode* traversal(vector<int>& nums, int left, int right)
 2{
 3    if(left > right) return nullptr;
 4    int mid = (left + right) / 2;
 5    TreeNode* root = new TreeNode(nums[mid]);
 6    root->left = traversal(nums, left, mid - 1);
 7    root->right = traversal(nums, mid + 1, right);
 8    return root;
 9}
10
11TreeNode* sortedArrayToBST(vector<int>& nums)
12{
13    return traversal(nums, 0, nums.size() - 1);
14}