当前位置:   article > 正文

189.二叉树:将有序数组转换为二叉搜索树(力扣)

189.二叉树:将有序数组转换为二叉搜索树(力扣)

代码解决

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. // 辅助函数,用于递归地构建BST
  15. TreeNode* traversal(vector<int>& nums, int left, int right)
  16. {
  17. // 如果左边界大于右边界,返回空节点
  18. if (left > right) return nullptr;
  19. // 取数组的中间元素作为根节点
  20. int mid = (left + right) / 2;
  21. TreeNode* root = new TreeNode(nums[mid]);
  22. // 递归构建左子树
  23. root->left = traversal(nums, left, mid - 1);
  24. // 递归构建右子树
  25. root->right = traversal(nums, mid + 1, right);
  26. return root;
  27. }
  28. // 主函数,将排序数组转换成BST
  29. TreeNode* sortedArrayToBST(vector<int>& nums)
  30. {
  31. // 初始化左边界和右边界
  32. int left = 0;
  33. int right = nums.size() - 1;
  34. // 调用辅助函数构建BST
  35. TreeNode* root = traversal(nums, left, right);
  36. return root;
  37. }
  38. };

代码使用了递归的方法。主要思路是首先找到数组的中间元素,然后以这个中间元素作为根节点,递归地在数组中构建左右子树。左子树包含数组中所有小于中间元素的元素,右子树包含所有大于中间元素的元素。

这里简要解释一下代码的工作流程:

  1. 定义一个辅助函数 traversal,它接受一个排序数组、左边界和右边界作为参数。
  2. 如果左边界大于右边界,返回空节点。
  3. 找到数组的中间元素,并以这个元素作为当前节点的值。
  4. 递归地构建左子树,左子树的元素值应小于当前节点的值,左边界为 left,右边界为 mid - 1
  5. 递归地构建右子树,右子树的元素值应大于当前节点的值,左边界为 mid + 1,右边界为 right
  6. 返回构建好的根节点。
  7. 在 sortedArrayToBST 函数中,初始化左边界和右边界,然后调用 traversal 函数构建二叉搜索树。

这个算法的时间复杂度是 O(n),其中 n 是数组中元素的数量。空间复杂度也是 O(n),因为需要存储递归调用的栈。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/745835
推荐阅读
相关标签
  

闽ICP备14008679号