有序链表转换二叉搜索树
问题:
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
思路:
思路很简单,由于链表不便于查找元素,我们将链表存入集合中操作,在二叉搜索树中,左边的结点总是小于右边的结点,刚好和集合元素排列顺序符合(题设元素升序),如果我们使用二分查找,每次取集合中的中间位置构建结点,就能保证左右子树均匀分配,又刚好符合平衡树的特性。
代码实现:
class Solution {
//存储链表元素的集合
ArrayList<Integer> arr = new ArrayList<>();
public TreeNode sortedListToBST(ListNode head) {
//转移元素
while(head != null) {
arr.add(head.val);
head = head.next;
}
int n = arr.size();
//根结点
TreeNode root = helper(0, n - 1);
return root;
}
//参数为集合边界
public TreeNode helper(int left, int right) {
//递归出口
if (left > right) return null;
//升序,总是取中间索引位置作为子树根结点
int mid = left + (right - left) / 2;
TreeNode root = new TreeNode(arr.get(mid));
//后序构建二叉平衡搜索树
root.left = helper(left, mid - 1);
root.right = helper(mid + 1, right);
return root;
}
}
时间 O(n)
空间 O(n)