Day56 将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树

https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/

示例1:

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案

     0                   0
    / \                 / \
  -3   9    或        -10  5
  /   /                 \  \
-10  5                  -3  9

示例2:

输入:nums = [1,3]
输出:[3,1]
解释:[1,3] 和 [3,1] 都是高度平衡二叉搜索树。

提示:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 按 严格递增 顺序排列

Java解法

思路:

  • 高度平衡意味着左右子树长度差不多,对于原始数组来说==[(左子树)root (右子树)]
  • 数组严格递增,实际就相当于不断得切分数组,在创建节点时保证左<根<右
package sj.shimmer.algorithm.m3_2021;

import sj.shimmer.algorithm.TreeNode;

/**
 * Created by SJ on 2021/3/22.
 */

class D56 {
    public static void main(String[] args) {
        TreeNode treeNode = sortedArrayToBST(new int[]{-10, -3, 0, 5, 9});
        TreeNode.getIntegerArray(treeNode);
    }
    public static TreeNode sortedArrayToBST(int[] nums) {

        return sortedArrayToBST(nums,0,nums.length-1);
    }
    public static TreeNode sortedArrayToBST(int[] nums,int start,int end) {
        TreeNode root = null;
        if (start<=end) {
            int mid = (start + end) / 2;
            root = new TreeNode(nums[mid]);
            root.left= sortedArrayToBST(nums,start,mid-1);
            root.right= sortedArrayToBST(nums,mid+1,end);
        }
        return root;
    }
}
image

官方解

https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/solution/jiang-you-xu-shu-zu-zhuan-huan-wei-er-cha-sou-s-33/

  1. 中序遍历,总是选择中间位置左边的数字作为根节点

    选择中间位置左边的数字作为根节点 ,与我的解法一致

    • 时间复杂度: O(n)
    • 空间复杂度:O(logn)
  2. 中序遍历,总是选择中间位置右边的数字作为根节点

  3. 中序遍历,选择任意一个中间位置数字作为根节点

你可能感兴趣的:(Day56 将有序数组转换为二叉搜索树)