给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
来源:力扣(LeetCode)
类似第108题,依然采用递归和二分法。
自己的方法,用了快慢指针来寻找链表的中点,并在中点的位置处截断链表。注意还需要用一个pre指针还记录中点位置(slow)的前驱节点。
class Solution { public TreeNode sortedListToBST(ListNode head) { return helper(head); } public TreeNode helper(ListNode head){ if(head==null) return null; if(head.next==null) return new TreeNode(head.val); ListNode fast=head; ListNode slow=head; ListNode pre=null; while(fast!=null&&fast.next!=null){ pre=slow; fast=fast.next.next; slow=slow.next; } pre.next=null; //截断 TreeNode node=new TreeNode(slow.val); node.left=helper(head); node.right=helper(slow.next); return node; } }别人的方法(去掉了pre指针,而是又写了一个函数,把二分的两个端点作为传入的参数)
class Solution { public TreeNode sortedListToBST(ListNode head) { return helper(head,null); } public TreeNode helper(ListNode left,ListNode right){ if(left==right) return null; ListNode mid=getMid(left,right); TreeNode node=new TreeNode(mid.val); node.left=helper(left,mid); node.right=helper(mid.next,right); return node; } public ListNode getMid(ListNode left,ListNode right){ ListNode fast=left; ListNode slow=left; while(fast!=right&&fast.next!=right){ fast=fast.next.next; slow=slow.next; } return slow; } }