Convert Sorted List to Binary Search Tree @LeetCode

2014-11-24 08:24:16 · 作者: · 浏览: 0
万能的递归法,注意到有一点比较巧的是,由于单链表都是单向的。所以这里我的查找区间设置为左闭右开!这样就避免了去找mid节点的前一个节点
package Level4;  
  
import Utility.ListNode;  
import Utility.TreeNode;  
  
  
/** 
 * Convert Sorted List to Binary Search Tree 
 *  
 *  Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 
 * 
 */  
public class S109 {  
  
    public static void main(String[] args) {  
        ListNode head = new ListNode(1);  
        ListNode n2 = new ListNode(3);  
        head.next = n2;  
        TreeNode root = sortedListToBST(head);  
    }  
  
    public static TreeNode sortedListToBST(ListNode head) {  
        return rec(head, null);  
    }  
      
    // 在区间[start, end)里递归,后面的end是包括在内的,这样可以避免要多用一个指针来记录mid前的节点  
    public static TreeNode rec(ListNode start, ListNode end){  
        if(start == end){  
            return null;  
        }  
          
        // 一次遍历找到中点的方法:快慢指针  
        ListNode mid = start;           // 该指针最终会指向中点  
        ListNode probe = start;         // 探针最终会到达end  
        while(probe!=end && probe.next!=end){       // 探针完成搜索,注意停止条件是和end比较而不是和null比!  
            mid = mid.next;  
            probe = probe.next.next;  
        }  
          
        TreeNode root = new TreeNode(mid.val);  
        root.left = rec(start, mid);  
        root.right = rec(mid.next, end);  
        return root;  
    }  
  
}