有序链表转换二叉查找树
LeetCode 109
使用中序遍历,递归的方法 方法 3:中序遍历模拟
- 遍历整个链表获得它的长度,我们用两个指针标记结果数组的开始和结束,记为 start 和 end,他们的初始值分别为 0 和 length - 1。
记住,我们当前需要模拟中序遍历,找到中间元素 (start + end) / - 注意这里并不需要在链表中找到确定的元素是哪个,只需要用一个变量告诉我们中间元素的下标。我们只需要递归调用这两侧。
- 递归左半边,其中开始和结束的值分别为 start, mid - 1。
- 在这个算法中,每当我们构建完二叉搜索树的左半部分时,链表中的头指针将指向根节点或中间节点(它成为根节点)。 因此,我们只需使用头指针指向的当前值作为根节点,并将指针后移一位,即 head = head.next。
- 我们在递归右半部分 mid + 1, end。
Java代码
1 | /** |
题目
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5