LeetCode OJ 109. 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.

涉及到二叉树的问题用递归的方法很容易理解。这个问题要求把一个升序排序的链表转换为一颗height balanced BST。转换的方式就是把链表的中间值作为树的根节点,中间值的左半部分转换为二叉树的左子树,中间值的右半部分转换为二叉树的右子树。

递归解决问题的步骤如下:

1. 如果链表的长度为0,返回null;

2. 如果链表长度为1,创建新的二叉树节点node,node.left=null,node.right=null,node.val=head.val。

3. 否则的话找到链表的中间节点,即第mid = length%2==0?length/2:length/2+1个节点为根节点node。此时链表被分成两个部分,前半部分的长度为mid-1,后半部分的长度为length-mid,递归求这两部分的结果,并把他们分别赋值给根节点的左子树和右子树。代码如下:

 1 public class Solution {
 2     public TreeNode sortedListToBST(ListNode head) {
 3         ListNode pointer = head;
 4                 
 5         int length = 0;
 6         while(pointer!=null){
 7             pointer = pointer.next;
 8             length++;
 9         }
10         
11         return listToBST(head, length);
12  
13     }
14     
15     public TreeNode listToBST(ListNode head,int length){
16         if(length==0) return null;
17         if(length==1){
18             TreeNode node = new TreeNode(head.val);
19             node.left = null;
20             node.right = null;
21             return node;
22         }
23         if(length==2){
24             TreeNode node = new TreeNode(head.val);
25             node.left = null;
26             node.right = listToBST(head.next, 1);
27             return node;
28         }
29         int mid = length%2==0?length/2:length/2+1;
30         
31         ListNode pointer = head;
32         ListNode righthead = null;
33         int i = 1;
34         while(pointer.next!=null && i<mid-1){
35             pointer = pointer.next;
36             i++;
37         }
38         TreeNode node = new TreeNode(pointer.next.val);
39         righthead = pointer.next.next;
40         pointer.next = null;
41         node.left = listToBST(head, mid-1);
42         node.right = listToBST(righthead, length-mid);
43         
44         return node;
45     }
46 }

 

posted @ 2016-04-21 10:00  Black_Knight  阅读(203)  评论(0编辑  收藏  举报