【从零开始刷leetcode-41】二叉树递归实践

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

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

示例 1:

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

示例 2:

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

提示:

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

解法 二分法 递归

平衡二叉树的要求是:对于树中的每一个节点,左子树和右子树的高度差(也称为平衡因子)的绝对值最多为1。平衡二叉树的目的是确保树的高度尽可能小,以便在执行查找、插入和删除等操作时能够保持较高的效率。

可以使用二分法,每次递归取中间的元素作为本次递归的根节点,递归去添加左子树和右子树。

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        // 二分法 递归
        if (nums.length == 2) 
            return new TreeNode(nums[0], null, new TreeNode(nums[1]));
        if (nums.length == 1) 
            return new TreeNode(nums[0]);
        int left = 0, right = nums.length - 1, middle = right >>> 1;
        TreeNode root = new TreeNode(nums[middle]);
        root.left = sortedArrayToBST(Arrays.copyOfRange(nums, 0, middle));
        root.right = sortedArrayToBST(Arrays.copyOfRange(nums, middle + 1, right + 1));
        return root;
    }
}

这个解法的不足在于每次递归都要创建新的数组,浪费空间。

我们另外创建一个函数,传入同一个函数和左右边界位置来代替——

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        // 二分法 递归
        return toTree(nums, 0, nums.length);
    }

    private TreeNode toTree(int[] nums, int left, int right) {
        if (left == right) return null;
        int middle = (left + right) / 2;
        TreeNode root = new TreeNode(nums[middle]);
        root.left = toTree(nums, left, middle);
        root.right = toTree(nums, middle + 1, right);
        return root;
    }
}

空间复杂度也得到了优化

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇