问题描述
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
0
/
-3 9
/ /
-10 5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree
解答
/** * 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; } * } */ //快慢指针找到链表中点作为root,每次这样迭代。 class Solution { public TreeNode buildTree(ListNode head, ListNode end){ if(head == end)return new TreeNode(head.val); ListNode slow = head; ListNode fast = head; while(fast!=end && fast.next != end){ slow = slow.next; fast = fast.next.next; } ListNode mid_pre = head; while(mid_pre != slow && mid_pre.next != slow)mid_pre = mid_pre.next; TreeNode root = new TreeNode(slow.val); if(head != slow)root.left = buildTree(head, mid_pre); else root.left = null; root.right = buildTree(slow.next, end); return root; } public TreeNode sortedListToBST(ListNode head) { if(head == null)return null; ListNode end = head; while(end.next != null)end = end.next; return buildTree(head, end); } }