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