leetcode每日一题(2020-07-03):108. 将有序数组转换为二叉搜索树

题目描述:
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

今日学习:
1.复习树的结构

题解:
1.我自己想的,递归:中点设为根节点,中点左右数组的中点设为左右孩子
2.简化版,有些地方想复杂了
3.不用切割数组,用start和end双指针递归
关于为什么平衡参考:https://leetcode-cn.com/problems/balance-a-binary-search-tree/solution/jiang-er-cha-sou-suo-shu-bian-ping-heng-by-leetcod/

//我自己想的哈哈哈哈哈哈哈哈哈
var sortedArrayToBST = function(nums) {
    //思路就是:中点设为根节点,中点左右数组的中点设为左右孩子
    if(nums.length == 0) {return null}
    if(nums.length == 1) {return new TreeNode(nums[0])}
    let mid
    if(nums.length % 2 == 0) {
        mid = ((nums.length - 1) >> 1) + 1
    }else {
        mid = (nums.length - 1) / 2
    }
    let root = new TreeNode(nums[mid])
    root.left = sortedArrayToBST(nums.slice(0, mid))
    root.right = sortedArrayToBST(nums.slice(mid + 1))
    return root
};
//简化版
var sortedArrayToBST = function(nums) {
    let n = nums.length
    if(n == 0) {return null}
    let mid = Math.floor(n/2)
    let root = new TreeNode(nums[mid])
    root.left = sortedArrayToBST(nums.slice(0, mid))
    root.right = sortedArrayToBST(nums.slice(mid + 1))
    return root
};
//双指针递归
const sortedArrayToBST = (nums) => {
    const buildBST = (nums, start, end) => {
        if (start > end) return null;
        const mid = (start + end) >>> 1;
        const root = new TreeNode(nums[mid]);
        root.left = buildBST(nums, start, mid - 1);
        root.right = buildBST(nums, mid + 1, end);
        return root;
    };
    return buildBST(nums, 0, nums.length - 1);
};
posted @ 2020-07-03 10:35  秋夜星空  阅读(95)  评论(0编辑  收藏  举报