2018-12-30

LeetCode 109. Convert Sorted List to Binary Search Tree.jpg

LeetCode 109. Convert Sorted List to Binary Search Tree

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

源代码文件在这里.
©本文首发于何睿的博客,欢迎转载,转载需保留文章来源,作者信息和本声明.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容

  • LeetCode 108. Convert Sorted Array to Binary Search Tree ...
    ruicore阅读 128评论 0 0
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,716评论 0 33
  • LeetCode 106. Construct Binary Tree from Inorder and Post...
    ruicore阅读 88评论 0 0
  • LeetCode 105. Construct Binary Tree from Preorder and Ino...
    ruicore阅读 153评论 0 0
  • 前天,凌晨四点的时候,起来上厕所,再次躺在床上的时候,却怎么都睡不着了。小狗四月在我身边跳来跳去,窗台上养的一盆铜...
    姜三疯阅读 941评论 5 51