109. 有序链表转换二叉查找树

有序链表转换二叉查找树

LeetCode 109

英文版

中文版

使用中序遍历,递归的方法 方法 3:中序遍历模拟

  1. 遍历整个链表获得它的长度,我们用两个指针标记结果数组的开始和结束,记为 start 和 end,他们的初始值分别为 0 和 length - 1。
    记住,我们当前需要模拟中序遍历,找到中间元素 (start + end) /
  2. 注意这里并不需要在链表中找到确定的元素是哪个,只需要用一个变量告诉我们中间元素的下标。我们只需要递归调用这两侧。
  3. 递归左半边,其中开始和结束的值分别为 start, mid - 1。
  4. 在这个算法中,每当我们构建完二叉搜索树的左半部分时,链表中的头指针将指向根节点或中间节点(它成为根节点)。 因此,我们只需使用头指针指向的当前值作为根节点,并将指针后移一位,即 head = head.next。
  5. 我们在递归右半部分 mid + 1, end。

Java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/**
* @description:
* @author: rhsphere
* @since: 2019-11-05 10:50 by jdk 1.8
*/
public class SortedListToBST {
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}

public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}

private ListNode head;

public TreeNode sortedListToBST(ListNode head) {
int size = this.size(head);
this.head = head;
return this.convertListToBST(0, size-1);
}

private int size(ListNode head) {
ListNode cur = head;
int count = 0;
while (cur != null) {
cur = cur.next;
count++;
}
return count;
}

private TreeNode convertListToBST(int low, int high) {
if (low > high)
return null;

int mid = (low + high) / 2;

TreeNode left = this.convertListToBST(low, mid-1);
TreeNode node = new TreeNode(this.head.val);
node.left = left;
this.head = this.head.next;

node.right = this.convertListToBST(mid+1, high);
return node;
}
}

题目

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定的有序链表: [-10, -3, 0, 5, 9],

一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:

 0
/ \

-3 9
/ /
-10 5


0%