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 }