将list改为链表后,无法在时间内完成对元素的读写。
两种解法:
1. 暴力法
按照把列表转换为BST的方法,递归实现,每次遍历一般的列表长度找到中间元素,则时间复杂度为,n次遍历,遍历平均长度为,空间复杂度为递归栈所需的。
2. 自底向上递归法。不采用暴力法中自顶向下生成树的方法,而自底向上生成。每次在自顶向下的方法中受到阻碍时都应尝试一下自低向上方法。但总体来说,自顶向下方法应是更优考虑,因为自底向上方法难以验证其正确性。(不懂。)
Python源码:
同我的心路。
我的心路:
一种解法是,遍历sorted linked list,生成一个列表,然后按照把列表转换为BST的方法实现。这种方法的时间复杂度是,空间复杂度是。
但该方法需要额外的空间开销,且不能动态地生成BST,所以可以进一步思考一下。
有序列表转换为BST的方法为,实现一个递归函数,递归函数的一个输入为当前列表,每次取当前列表的中间节点为该子树的根节点,并返回列表左侧生成的子树为左子树,右侧为右子树。边界条件为,列表为空,则返回None。
结果还不错。
Runtime: 112 ms, faster than 81.82% of Python online submissions for Convert Sorted List to Binary Search Tree.
Memory Usage: 23.9 MB, less than 44.44% of Python online submissions for Convert Sorted List to Binary Search Tree.
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def sortedListToBST(self, head):
"""
:type head: ListNode
:rtype: TreeNode
"""
sorted_list = []
while(head != None):
sorted_list.append(head.val)
head = head.next
start = 0
end = len(sorted_list)-1
return self.sorted_list_to_BST(sorted_list, start, end)
def sorted_list_to_BST(self, sorted_list, start, end):
if start > end:
return None
mid = start + (end - start) // 2
node = TreeNode(sorted_list[mid])
node.left = self.sorted_list_to_BST(sorted_list, start, mid - 1)
node.right = self.sorted_list_to_BST(sorted_list, mid + 1, end)
return node