给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree
【分治递归】
public TreeNode sortedListToBST(ListNode head) {
return tree(head, null);
}
private TreeNode tree(ListNode start, ListNode end) {
if (start == end) {
return null;
}
ListNode median = getMedian(start, end);
TreeNode root = new TreeNode(median.val);
root.left = tree(start, median);
root.right = tree(median.next, end);
return root;
}
private ListNode getMedian(ListNode start, ListNode end) {
ListNode fast = start;
ListNode slow = start;
while (fast != end && fast.next != end) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
【分治递归+中序遍历】
private ListNode copyHead;
public TreeNode sortedListToBST(ListNode head) {
copyHead = head;
int length = getListNodeLength(head);
return inOrderBuildTree(0, length - 1);
}
private int getListNodeLength(ListNode node){
int length = 0;
while (node!=null){
node = node.next;
length++;
}
return length;
}
private TreeNode inOrderBuildTree(int left, int right) {
if (left > right) {
return null;
}
int mid = (left+right+1)/2;
TreeNode tree = new TreeNode();
tree.left = inOrderBuildTree(left,mid-1);
tree.val = copyHead.val;
copyHead = copyHead.next;
tree.right = inOrderBuildTree(mid+1,right);
return tree;
}