leetcode刷题记录(七十三)——543. 二叉树的直径

(一)问题描述

108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)108. 将有序数组转换为二叉搜索树 - 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1:[https://assets.leetcode.com/uploads/2021/02/18/btree1.jpg]输入:nums = [-10,-3,0,5,9]输出:[0,-3,9,-10,null,5]解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:[https://assets.leetcode.com/uploads/2021/02/18/btree2.jpg]示例 2:[https://assets.leetcode.com/uploads/2021/02/18/btree.jpg]输入:nums = [1,3]输出:[3,1]解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。 提示: * 1 <= nums.length <= 104 * -104 <= nums[i] <= 104 * nums 按 严格递增 顺序排列https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/?envType=study-plan-v2&envId=top-100-liked给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡二叉搜索树。

平衡二叉树 是指该树所有节点的左右子树的高度相差不超过 1 。

示例 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严格递增 顺序排列

(二)解决思路

用一个有序数组转化成二叉搜索树,无论是不是限定"平衡",可能的结果都会有好几种。以下图片来自力扣官方题解。

这里我将数组分为左右两半,中间节点作为根节点,左边一半再分为一半,取中间节点,右边一半也再分为一半,取中间节点,以此类推。

这里有两点小细节:

  • 当考虑范围内的长度为偶数时,中间节点取左侧节点
  • 递归的结束条件是考虑范围的左边界left<右边界right,而不是等于。可以想象只有一个节点的情况,如果是等于,会遗漏节点。
java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return sort(0,nums.length-1,nums);
        
    }
    public TreeNode sort(int left,int right,int[] nums){
        //这里不能是等于,只能是大于
        if(left>right) return null;
        int idx=(left+right)/2;
        TreeNode mid=new TreeNode(nums[idx]);
        mid.left=sort(left,idx-1,nums);
        mid.right=sort(idx+1,right,nums);
        return mid;
    }
}
相关推荐
tobias.b1 分钟前
408真题解析-2010-7-数据结构-无向连通图
数据结构·算法·图论·计算机考研·408真题解析
良木生香1 小时前
【鼠鼠优选算法-双指针】003:快乐数 & 004:盛水最多的容器
算法
Cx330❀1 小时前
【优选算法必刷100题】第41-42题(模拟):Z 字形变换,外观数列
c++·算法
沃尔特。1 小时前
直流无刷电机FOC控制算法
c语言·stm32·嵌入式硬件·算法
CW32生态社区1 小时前
CW32L012的PID温度控制——算法基础
单片机·嵌入式硬件·算法·pid·cw32
Cx330❀1 小时前
【优选算法必刷100题】第038题(位运算):消失的两个数字
开发语言·c++·算法·leetcode·面试
漫随流水1 小时前
leetcode回溯算法(93.复原IP地址)
数据结构·算法·leetcode·回溯算法
燃于AC之乐1 小时前
我的算法修炼之路--5——专破“思维陷阱”,那些让你拍案叫绝的非常规秒解
c++·算法·贪心算法·bfs·二分答案·扩展域并查集·动态规划(最长上升子序列)
艾莉丝努力练剑1 小时前
【优选算法必刷100题】第021~22题(二分查找算法):山脉数组的峰顶索引、寻找峰值
数据结构·c++·算法·leetcode·stl
艾莉丝努力练剑1 小时前
【优选算法必刷100题】第007~008题(双指针算法):三数之和、四数之和问题求解
linux·算法·双指针·优选算法