当前位置: 首页 > article >正文

Leetcode 109.有序链表转换二叉搜索树(Medium)

给定一个单链表的头节点  head ,其中的元素 按升序排序 ,将其转换为 平衡 二叉搜索树。

示例 1:

输入: head = [-10,-3,0,5,9]
输出: [0,-3,9,-10,null,5]
解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。

示例 2:

输入: head = []
输出: []

提示:

  • head 中的节点数在[0, 2 * 104] 范围内
  • -105 <= Node.val <= 10

思路:先获取到链表的长度,然后去递归构造树即可,每次构造的树节点永远是链表或子链表的中心,但是由于是单向链表,所以每次获取链表中的节点的时候就会导致每次都从头开始,可以用循环链表改善,如果要构造的节点的坐标大于length/2的时候就next length -index次,然后递归构造,设置临界条件即可,若length为0就是无节点,如果length为1就是叶子节点。然后上代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
/**
 * 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 {
    ListNode temp;
    public TreeNode sortedListToBST(ListNode head) {
        temp = head;
        // 思路就是取链表的中心节点,作为总树或子树的根节点,然后循环、递归
        int length = getListLength(head);
        return buildTree(0, length);
        
    }
    
    
    public TreeNode buildTree(int start ,int length) {
        int i = 0;
        ListNode t = temp;
        while (i < start + length/2) {
            t = t.next;
            i++;
        }
        
        // 如果是0,直接为null
        if (length == 0) return null;
        
        // 如果length为1的时候,直接返回,因为它已经是树叶节点了
        if (length == 1) return new TreeNode(t.val, null, null);
        
        // 遍历到中心节点,就构造节点
        return new TreeNode(t.val, buildTree(start, length/2), buildTree(start + length/2 +1, length-1-length/2));
        
    }
    

    // 获取节点总节点数
    public int getListLength(ListNode head) {
        int length = 0;
        while(head != null) {
            length++;
            head = head.next;
        }
        return length;
    }
    
}

快慢指针也是解决中间值问题的一个快速的解决办法,思路相同,只是取中间值的方法不同。

class Solution {
    public TreeNode sortedListToBST(ListNode head) {
        return buildTree(head, null);
    }

    public TreeNode buildTree(ListNode left, ListNode right) {
        if (left == right) {
            return null;
        }
        ListNode mid = getMedian(left, right);
        TreeNode root = new TreeNode(mid.val);
        root.left = buildTree(left, mid);
        root.right = buildTree(mid.next, right);
        return root;
    }

    public ListNode getMedian(ListNode left, ListNode right) {
        ListNode fast = left;
        ListNode slow = left;
        while (fast != right && fast.next != right) {
            fast = fast.next;
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
}


http://www.kler.cn/a/304040.html

相关文章:

  • 论软件维护及其应用子问题
  • Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别
  • Sql server 备份还原方法
  • Java面试要点02 - 自动装箱与拆箱的原理与性能解析
  • 容器docker的ulimit
  • C语言入门案例练习4——九九乘法表
  • Android Studio 安装2022版稳定版 2022.3.1 详细操作(带图展示)
  • OpengGL教程(三)---使用VAO和VBO方式绘制三角形
  • 02 Docker基本管理
  • 个性化、持续性阅读 学生英语词汇量自然超越标准
  • 智慧交通基于yolov8的行人车辆检测计数系统python源码+onnx模型+精美GUI界面
  • Camera2 预览旋转方向、拍照、录像成像旋转
  • Pytorch维度转换操作:view,reshape,permute,flatten函数详解
  • 计算左边(比自己小的元素)的最长距离
  • Linux中常见的Docker问题及解决方法
  • Oracle rman 没有0级时1级备份和0级大小一样,可以用来做恢复 resetlogs后也可以
  • 基于python+django+vue的农业管理系统
  • 2024北京IC WORLD大会圆满收官!高频科技收获满满,同“芯”共促产业发展
  • Ai+若依(智能售货机运营管理系统---帝可得)--货道关联商品【08篇---0004:关联商品】
  • Vue:watchEffect的作用与性质
  • C++库std::clamp
  • Android Studio新建工程(Java语言环境)
  • Cassandra 和 ScyllaDB
  • Matlab初等数学与线性代数
  • 如何搭建一个自己的外卖会员卡系统?
  • Qt篇——Qt使用C++获取Windows电脑上所有外接设备的名称、物理端口位置等信息