109.有序链表转换二叉搜索树

题目描述

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

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

示例:

1
2
3
4
5
6
7
8
9
给定的有序链表: [-10, -3, 0, 5, 9],

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

0
/ \
-3 9
/ /
-10 5

题解

先序遍历+递归

先将链表转换成一个列表, 然后按照先序遍历的顺序, 二分查找生成节点

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
public class lc109 {
public TreeNode sortedListToBST(ListNode head) {
if (head == null)
return null;

List<Integer> list = new ArrayList<>();
while (head != null) {
list.add(head.val);
head = head.next;
}

return recur(list, 0, list.size() - 1);

}

private TreeNode recur(List<Integer> list, int l, int r) {
if (l > r)
return null;
int mid = (l + r) / 2;
TreeNode root = new TreeNode(list.get(mid));
root.left = recur(list, l, mid-1);
root.right = recur(list, mid+1, r);
return root;
}

}

快慢指针

不将链表转换成列表, 使用快慢指针的方法也能实现对应的功能, 目的就是为了找出中点嘛

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public TreeNode sortedListToBST(ListNode head) {
if (head == null) return null;
return helper(head, null);

}

private TreeNode helper(ListNode head, ListNode tail) {
if (head == tail) return null;
// mid
ListNode slow = head;
ListNode fast = head;
while (fast != tail && fast.next != tail) {
slow = slow.next;
fast = fast.next.next;
}
TreeNode root = new TreeNode(slow.val);
root.left = helper(head, slow);
root.right = helper(slow.next, tail);
return root;
}
}
-------------本文结束感谢您的阅读-------------
可以请我喝杯奶茶吗