描述
给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树
样例
2
1->2->3 => / \
1 3
思路:每次找到链表的中点,中点作为根节点,然后左边的链表形成的树为这个根节点的左子树,右边同理。
需要注意的是,每次我们实际找的是中点前一个节点, 因为我们需要将前半段的链表断开,形成一个独立的链表。
代码:
public TreeNode sortedListToBST(ListNode head) {
if(head==null){
return null;
}
if(head.next==null){
return new TreeNode(head.val);
}
ListNode fast = head.next;
ListNode slow = head;
while (fast.next!=null && fast.next.next!=null){
slow = slow.next;
fast = fast.next.next;
}
ListNode nextHead = slow.next;
slow.next = null;
TreeNode root = new TreeNode(nextHead.val);
root.left = sortedListToBST(head);
root.right = sortedListToBST(nextHead.next);
return root;
}