算法(TS):将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例一

输入:nums = -10,-3,0,5,9

输出

或者

示例二

输入:nums = 1,3

输出

提示:

  • 1 <= nums.length <= 104
  • -104 <= numsi <= 104
  • nums 按 严格递增 顺序排列

解答一

先创建一个平衡二叉树,再中序遍历它,将数组中的值依次赋值给节点。

scss 复制代码
/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function sortedArrayToBST(nums: number[]): TreeNode | null {
    let BST
    // 创建二叉平衡树
    const createBST = (size: number) => {
        const root = new TreeNode()
        size--
        const stack: TreeNode[] = [root]
        while(size > 0 && stack.length) {
            const node = stack.shift()
            const left = new TreeNode()
            node.left = left
            stack.push(left)
            size--
            if (size) {
                const right = new TreeNode()
                node.right = right
                stack.push(right)
            }
            size--
        }

        return root
    }
    // 中序遍历二叉树将数组中的值赋给节点
    const  inorderInsertValue = (root: TreeNode,nums: number[]) => {
        const stack: TreeNode[] = []
        const inorder = (r: TreeNode) => {
            if(r.left) {
                inorder(r.left)
            }
            r.val = nums.shift()
            if (r.right) {
                inorder(r.right)
            }
        }
        inorder(root)
    }

    if (nums.length) {
        BST = createBST(nums.length)
        inorderInsertValue(BST,nums)

    }
    return BST
};

时间复杂度O(n + n),空间复杂度O(height),height为树的高度。

解法二

使用递归创建左右子树的根节点,每一次取数组中间的数作为节点的值。

sql 复制代码
/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function sortedArrayToBST(nums: number[]): TreeNode | null {
    if(nums.length === 0) return null

    const createNode = (nums: number[],start: number,end: number):TreeNode | null => {
        if (start > end) return null
        const m = Math.floor((start + end)/2)
        const root = new TreeNode(nums[m])
        root.left = createNode(nums,start,m - 1)
        root.right = createNode(nums,m + 1, end)

        return root
    }

    return createNode(nums,0,nums.length - 1)
};

时间复杂度O(n),空间复杂度O(height),height为树的高度。

相关推荐
Chen—LSN7 分钟前
数据结构——拿捏复杂度
java·c语言·开发语言·数据结构·经验分享·笔记·算法
Chen_harmony12 分钟前
六、排序详解
c语言·数据结构·算法·排序算法
-dzk-25 分钟前
【贪心算法】LC 55.跳跃游戏
算法·游戏·贪心算法
ofoxcoding27 分钟前
Jev 模型评测深度解析:核心得分、能力局限与最佳适用任务场景
人工智能·算法·机器学习·ai
Evand J43 分钟前
【MATLAB例程】三维A*路径规划与TOA-AOA-TDOA融合定位算法。附下载链接
数据库·算法·matlab
Doubbbbbbble云1 小时前
图算法中的剪枝技术与启发式优化分析4
算法·机器学习·剪枝
鶴哥只手遮天1 小时前
CFL3D深度解析:NASA经典CFD求解器的架构、算法与工程实践
算法
维克兜率天1 小时前
【维克】价差交易实战:配对交易的核心参数设置
大数据·笔记·算法·量化
dtq04241 小时前
数据结构 - 树的概念
c语言·数据结构·学习·算法
晒太羊的猫1 小时前
hot100多维动态规划刷题
算法·动态规划