- 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],
-
一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
0 / \ -3 9 / / -10 5
-
分析:
由于链表时经过排序的,我们可以先找出链表的中间值,并且将该链表分成两部分。使得该中间值做为平衡二叉树的根节点,接着递归调用,根节点的左子树的值小于根节点的值,根节点的右子树的值大于根节点的值。
/**
* 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||head.next==null){//递归终止条件
return head==null?null:new TreeNode(head.val);
}
ListNode slow=head;
ListNode mid=head;
ListNode fast=head;
while(fast!=null&&fast.next!=null){//寻找链表的中间值
mid=slow;
fast=fast.next.next;
slow=slow.next;
}
mid.next=null; //将原链表分成两个子链表
TreeNode root=new TreeNode(slow.val);
root.left=sortedListToBST(head); //根节点的左子树存储小于根节点的值
root.right=sortedListToBST(slow.next);//根节点的右子树存储大于根节点的值
return root;
}
}