代码解决
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/class Solution { public:// 辅助函数,用于递归地构建BSTTreeNode* traversal(vector<int>& nums, int left, int right){// 如果左边界大于右边界,返回空节点if (left > right) return nullptr;// 取数组的中间元素作为根节点int mid = (left + right) / 2;TreeNode* root = new TreeNode(nums[mid]);// 递归构建左子树root->left = traversal(nums, left, mid - 1);// 递归构建右子树root->right = traversal(nums, mid + 1, right);return root;}// 主函数,将排序数组转换成BSTTreeNode* sortedArrayToBST(vector<int>& nums) {// 初始化左边界和右边界int left = 0;int right = nums.size() - 1;// 调用辅助函数构建BSTTreeNode* root = traversal(nums, left, right);return root;} };
代码使用了递归的方法。主要思路是首先找到数组的中间元素,然后以这个中间元素作为根节点,递归地在数组中构建左右子树。左子树包含数组中所有小于中间元素的元素,右子树包含所有大于中间元素的元素。
这里简要解释一下代码的工作流程:
- 定义一个辅助函数
traversal
,它接受一个排序数组、左边界和右边界作为参数。- 如果左边界大于右边界,返回空节点。
- 找到数组的中间元素,并以这个元素作为当前节点的值。
- 递归地构建左子树,左子树的元素值应小于当前节点的值,左边界为
left
,右边界为mid - 1
。- 递归地构建右子树,右子树的元素值应大于当前节点的值,左边界为
mid + 1
,右边界为right
。- 返回构建好的根节点。
- 在
sortedArrayToBST
函数中,初始化左边界和右边界,然后调用traversal
函数构建二叉搜索树。这个算法的时间复杂度是 O(n),其中 n 是数组中元素的数量。空间复杂度也是 O(n),因为需要存储递归调用的栈。