【LeetCode】109. Convert Sorted List to Binary Search Tree

32 篇文章 0 订阅
32 篇文章 0 订阅

将list改为链表后,无法在O(1)时间内完成对元素的读写。

两种解法:

1. 暴力法

    按照把列表转换为BST的方法,递归实现,每次遍历一般的列表长度找到中间元素,则时间复杂度为O(nlogn),n次遍历,遍历平均长度为log(n),空间复杂度为递归栈所需的O(logn)

2. 自底向上递归法。不采用暴力法中自顶向下生成树的方法,而自底向上生成。每次在自顶向下的方法中受到阻碍时都应尝试一下自低向上方法。但总体来说,自顶向下方法应是更优考虑,因为自底向上方法难以验证其正确性。(不懂。)

Python源码:

    同我的心路。

我的心路:

    一种解法是,遍历sorted linked list,生成一个列表,然后按照把列表转换为BST的方法实现。这种方法的时间复杂度是O(n),空间复杂度是O(n)

    但该方法需要额外的空间开销,且不能动态地生成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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值