先回顾一下二叉搜索树的定义:左子树的任一节点都小于根节点,右子树的任一节点都大于根节点
现在拿到了一个有序数组,自然可以想到要从中间开始进行遍历,因此首先找到数组的中间节点,并以它作为根节点向左右进行遍历,因为数组已经有序,所以不需要再进行比较,只需要明确每一次构造的左右边界即可
至于为什么不需要考虑奇偶数组的情况,这是因为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}