🌗 109. 有序铟衚蜬换二叉搜玢树

吞䜛童子2022幎10月10日
  • algorithm
  • tree
  • list
小于 1 分钟

🌗 109. 有序铟衚蜬换二叉搜玢树

隟床: 🌗

问题描述

img_20.png


解法

/**
 * 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 {
    public TreeNode sortedListToBST(ListNode head) {
        // 思路
        // 快慢指针扟䞭点对䞭点进行拆分
        return mySol(head);
    }

    private TreeNode mySol(ListNode head) {
        // 递園终止条件
        if(head == null) {
            return null;
        }
        if(head.next == null) {
            return new TreeNode(head.val);
        }
        ListNode pre = getMid(head); // 䞭点偏巊
        ListNode mid;
        if(pre == null) {
            // 铟衚只有 2 䞪节点
            mid = head;
        } else {
            mid = pre.next;
            pre.next = null;
        }
        ListNode next = mid.next;
        mid.next = null;
        TreeNode root = new TreeNode(mid.val);
        // System.out.println(root.val);
        if(pre != null) {
            root.left = mySol(head);
        }
        root.right = mySol(next);
        return root;
    }

    private ListNode getMid(ListNode head) {
        ListNode pre = null;
        ListNode slow = head;
        ListNode fast = head.next;
        while(fast != null && fast.next != null) {
            fast = fast.next.next;
            pre = slow;
            slow = slow.next;
        }
        return pre; // 埗到偏巊䞭点前面的节点
    }
}

蟓出

img_19.png

䞊次猖蟑于: 2022/10/10 䞋午8:43:48
莡献者: liuxianzhishou