LeetCode 109. Convert Sorted List to BST

简介: 给定一个链表,其中元素按升序排序,将其转换为高度平衡的BST。对于这个问题,高度平衡的二叉树被定义为:二叉树中每个节点的两个子树的深度从不相差超过1。

v2-7fc5931b72e36fd56fc62f9368da0f03_1440w.jpg

Description



Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.


For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.


Example:


Given the sorted linked list: [-10,-3,0,5,9],

One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST:


0
     / \
   -3   9
   /   /
 -10  5


描述



给定一个链表,其中元素按升序排序,将其转换为高度平衡的BST。

对于这个问题,高度平衡的二叉树被定义为:二叉树中每个节点的两个子树的深度从不相差超过1。


例:


给定排序数组:[ - 10,-3,0,5,9],

一个可能的答案是:[0,-3,9,-10,null,5],它代表以下高度平衡的BST:


0
     / \
   -3   9
   /   /
 -10  5


思路



  • 此题目与108题类似,只不过给定的原始数据由108题的数组,变成了链表,链表的元素不支持随机访问,导致取中间值不能够通过索引来取得.
  • 这里着重说明以下取链表中间值的操作:我们用两个指针slow和fast,slow指针每次向后走一个位置,fast指针每次向后走两个位置,当fast到达末尾时,slow就到达了中间位置.
  • 注意结束条件:由于fast指针是被允许走到end位置的,于是就不能用fast.next.next == end 来作为结束条件.由于fast指针每次能够向后走两步,于是fast.enxt == end 时就应该结束循环,fast == end 时 也应该结束循环.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2018-12-30 13:57:09
# @Last Modified by:   何睿
# @Last Modified time: 2018-12-30 15:47:35
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
# Definition for a binary tree node.
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
class Solution:
    def sortedListToBST(self, head):
        """
        :type head: ListNode
        :rtype: TreeNode
        """
        if not head:
            return None
        return self.recursion(head, None)
    # 链表从start开始,到end结束,左闭右开,[start,end),包括start节点,不包括end节点
    def recursion(self, start, end):
        # 取中间值作为当前根节点
        middle = self.serachmid(start, end)
        # 递归结束条件,当left大于right时,返回空节点
        if not middle:
            return None
        # 声明根节点
        root = TreeNode(middle.val)
        # 生成左子树
        leftree = self.recursion(start, middle)
        # 生成右子树
        rightree = self.recursion(middle.next, end)
        root.left = leftree
        root.right = rightree
        # 返回根节点
        return root
    # 寻找中间值
    def serachmid(self, start, end):
        # 搜索一个链表的中间值
        if start == end:
            return None
        if start.next == end:
            return start
        slow, fast = start, start.next
        # 因为fast每次需要向后走两步,而fast.next.next == end时,fast是被允许走到end的
        # 于是就不能用fast.next.enxt == end 作为结条件,结束条件为fast.next != end and fast !=end:
        while fast and fast.next and fast.next != end and fast !=end:
            slow = slow.next
            fast = fast.next.next
        return slow


源代码文件在这里.


目录
相关文章
|
6月前
|
Java
Leetcode 114. Flatten Binary Tree to Linked List
思路也很简单,先把root的左子树(如有)变成单链表 leftlinkedlist,把root的右子树(如有)变成单链表 rightlinkedlist,再把root的右节点变成leftlikedlist,再把rightlinkedlist接到leftlinkedlist后面,代码如下。
20 1
|
6月前
|
C++
Leetcode Copy List with Random Pointer(面试题推荐)
给大家推荐一道leetcode上的面试题,这道题的具体讲解在《剑指offer》的P149页有思路讲解,如果你手头有这本书,建议翻阅。
27 0
|
7月前
|
Java
【Java基础】Java8 使用 stream().sorted()对List集合进行排序
【Java基础】Java8 使用 stream().sorted()对List集合进行排序
211 0
|
6月前
Leetcode 19.Remove Nth Node From End of List
删除单链表中的倒数第n个节点,链表中删除节点很简单,但这道题你得先知道要删除哪个节点。在我的解法中,我先采用计数的方式来确定删除第几个节点。另外我在头节点之前额外加了一个节点,这样是为了把删除头节点的特殊情况转换为一般情况,代码如下。
20 0
|
5月前
|
大数据 Java 程序员
「LeetCode合集」链表(List)及经典问题
「LeetCode合集」链表(List)及经典问题
27 0
|
6月前
Leetcode 230. Kth Smallest Element in a BST
先来看下二叉搜索树的性质,对于任意一个非叶子节点,它的左子树中所有的值必定小于这个节点的val,右子树中所有的值必定大于或等于当前节点的val。 这条性质就保证了如果我们对二叉搜索树做中序遍历,中序遍历的结果肯定是有序的。对于此题而言,我们只需要拿到中序遍历结果,然后返回第k个即可,时间复杂度是O(n)。
46 1
LeetCode 141. 环形链表 Linked List Cycle
LeetCode 141. 环形链表 Linked List Cycle
LeetCode 234. 回文链表 Palindrome Linked List
LeetCode 234. 回文链表 Palindrome Linked List
LeetCode 206. 反转链表 Reverse Linked List
LeetCode 206. 反转链表 Reverse Linked List
LeetCode 19. 删除链表的倒数第N个节点 Remove Nth Node From End of List
LeetCode 19. 删除链表的倒数第N个节点 Remove Nth Node From End of List