109. Convert Sorted List to Binary Search Tree

Posted tobeabetterpig

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了109. Convert Sorted List to Binary Search Tree相关的知识,希望对你有一定的参考价值。

109. Convert Sorted List to Binary Search Tree
(AC)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
  
class Solution {
    public TreeNode sortedListToBST(ListNode head) {
      if(head == null) return null;
      return helper(head, null);
    }
  
    public TreeNode helper(ListNode head, ListNode tail){
      if(head == tail) return null;/////
    
      ListNode slow = head;
      ListNode fast = head;
      
      
      while(fast != tail && fast.next != tail){
        slow = slow.next;
        fast = fast.next.next;
      }
      
      TreeNode root = new TreeNode(slow.val);
      root.left = helper(head, slow);
      root.right = helper(slow.next, tail);
      return root;
    }
}










/// NullPointerException


class Solution {
    public TreeNode sortedListToBST(ListNode head) {
      // base cases 
      // size = 0;
      if(head == null) return null;
      // size = 1
      if(head.next == null){
        TreeNode root = new TreeNode(head.next.val);
        return root;
      }
      
      // size = 2
      if(head.next.next == null){
        TreeNode next = new TreeNode(head.next.val);
        TreeNode root = new TreeNode(head.val);
        
        root.right = next;
        return root;
      }
      
      // size = 3 
      if(head.next.next.next == null){
        TreeNode root = new TreeNode(head.next.val);
        TreeNode right = new TreeNode(head.next.next.val);
        TreeNode left = new TreeNode(head.val);
        
        root.left = left;
        root.right = right;
        
        return root;
      }
      
      // induction rules
      
      ListNode mid = findMid(head);
      ListNode rootNode = mid.next;
      ListNode nextNode = rootNode.next;
      
      mid.next = null;
      rootNode.next = null;
      
      TreeNode root = new TreeNode(rootNode.val);
      root.left = sortedListToBST(head);
      root.right = sortedListToBST(nextNode);
      
      return root;
    }
    
    private ListNode findMid(ListNode head){
      ListNode fast = head;
      ListNode slow = head;
      
      while(fast.next != null && fast.next.next != null){
        fast = fast.next.next;
        slow = slow.next;
      }
      return slow;
    }
}

 

以上是关于109. Convert Sorted List to Binary Search Tree的主要内容,如果未能解决你的问题,请参考以下文章

109. Convert Sorted List to Binary Search Tree

leetcode 109 Convert Sorted List to Binary Search Tree

109. Convert Sorted List to Binary Search Tree

109. Convert Sorted List to Binary Search Tree

109. Convert Sorted List to Binary Search Tree

leetcode-algorithms-109. Convert Sorted List to Binary Search Tree