• 【数据结构基础_树】Leetcode 108.将有序数组转换为二叉搜索树


    原题链接:Leetcode 108. Convert Sorted Array to Binary Search Tree

    Given an integer array nums where the elements are sorted in ascending order, convert it to a height-balanced binary search tree.

    A height-balanced binary tree is a binary tree in which the depth of the two subtrees of every node never differs by more than one.

    Example 1:

    Input: nums = [-10,-3,0,5,9]
    Output: [0,-3,9,-10,null,5]
    Explanation: [0,-10,5,null,-3,null,9] is also accepted:
    
    • 1
    • 2
    • 3

    Example 2:

    Input: nums = [1,3]
    Output: [3,1]
    Explanation: [1,null,3] and [3,1] are both height-balanced BSTs.
    
    • 1
    • 2
    • 3

    Constraints:

    • 1 <= nums.length <= 104
    • -104 <= nums[i] <= 104
    • nums is sorted in a strictly increasing order.

    方法一:递归

    思路:

    题目要求从有个递增数组来构造BST
    BST本身是递归定义的,构造的时候也想到递归
    虽然题目要求构造的BST要满足平衡,但仍然是不唯一的。那么可以设定每次选取中间值的时候,都向下取整

    C++代码:

    /**
     * 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:
        TreeNode* sortedArrayToBST(vector<int>& nums) {
            return helper(nums, 0, nums.size() - 1);
        }
    
        TreeNode* helper(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 = helper(nums, left, mid - 1);
            root->right = helper(nums, mid + 1, right);
            return root;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    复杂度分析:

    • 时间复杂度:O(n),每个结点都处理过一次
    • 空间复杂度:O(logn),递归栈的深度
  • 相关阅读:
    QT自定义空间之软键盘
    oracle10g的dataguard测试
    JVM(十八)—— 垃圾回收(四)
    MFC Windows 程序设计[132]之打开按钮的启用与禁用
    YOLOv5:修改backbone为SPD-Conv
    提升珠宝管理效率的新零售行业RFID应用解决方案
    mavlink 避坑指南
    输入框内禁止输入特殊字符
    JS element从数组中取出两个字段组成新的数组
    Apache Kafka 快速学习大纲
  • 原文地址:https://blog.csdn.net/cwtnice/article/details/126079002