zoukankan      html  css  js  c++  java
  • 有序链表转二叉搜索树、转二叉搜索平衡树(LeetCode108,109)

    有序链表转二叉搜索树、二叉搜索平衡树

    转二叉搜索树

    二叉搜索树中序遍历得到有序数组的逆过程。

    class Solution {
        public TreeNode sortedArrayToBST(int[] nums) {
            return dfs(nums, 0, nums.length - 1); // [0 , length - 1]
        }
    
        private TreeNode dfs(int[] nums, int low, int high) {
            if (low > high) {
                return null;
            } 
            // 以升序数组的中间元素作为根节点 root。
            int mid = low + (high - low) / 2;
            TreeNode root = new TreeNode(nums[mid]);
            // 递归的构建 root 的左子树与右子树。
            // { [low , mid - 1] [mid] [mid + 1, high] }
            root.left = dfs(nums, low, mid - 1);
            root.right = dfs(nums, mid + 1, high); 
            return root;
        }
    }
    
    

    转二叉搜索平衡树

    二叉搜索平衡树就是每次按照链表的中间结点来做根结点。

    快指针按照2倍速增长,慢指针按照1倍速增长,当快指针到达链表低的时候,慢指针的位置就是中间元素。

    EXP:
    Nodes's num = 9;
    4s later: fast = 8, slow = 4.
    abviously, (num + 1) / 2 is our ans, so need fast to move a incomplete move which means to move one more step;
    
    After find the mid, we also need to break the old LinkedList, to create two new LinkedList;
    [head, slow.pre] [slow] [slow.next, end];
    [slow] will be used for the root node;
    [head, slow.pre] will be used to be the root node's left child tree;
    [slow.next, end] wiil be used to be the root node's right child tree;
    

    CODING:

    class Solution {
        public TreeNode sortedListToBST(ListNode head) {
            if (head == null) {
                return null;
            }
    
            if (head.next == null) {
                return new TreeNode(head.val);
            }
    
            // 快慢指针找中心节点
            ListNode slow = head, fast = head, pre = null;
            while (fast != null && fast.next != null) {
                pre = slow;
                slow = slow.next;
                fast = fast.next.next;
            }
            // 断开链表 使得后续分治得以进行
            pre.next = null;
           
            // 以升序链表的中间元素作为根节点 root,递归的构建 root 的左子树与右子树。
            TreeNode root = new TreeNode(slow.val);
            root.left = sortedListToBST(head); //旧链表左端起始
            root.right = sortedListToBST(slow.next);// 拆分的新链表起始
            return root;
        }
    }
    
    
  • 相关阅读:
    如何实现对ELK各组件的监控?试试Metricbeat
    Dubbo日志链路追踪TraceId选型
    Spring Security如何优雅的增加OAuth2协议授权模式
    聊一聊:MyBatis和Spring Data JPA的选择问题
    Java微服务 vs Go微服务,究竟谁更强!?
    你一定需要知道的高阶JAVA枚举特性!
    当音乐学博士搞起编程,用一本书改变了Java世界!
    Spring Boot 2.x基础教程:使用Flyway管理数据库版本
    文件上传的单元测试怎么写?
    Spring Boot 2.x基础教程:多个文件的上传
  • 原文地址:https://www.cnblogs.com/DengSchoo/p/13859316.html
Copyright © 2011-2022 走看看