题解 | #二叉搜索树与双向链表#

二叉搜索树与双向链表

http://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5

【剑指offer】二叉搜索树与双向链表(python)

思路:将所有结点中序遍历到一个列表,因为是左中右遍历,因为二叉搜索树自身的性质,所以遍历后就是升序的有序数组,这是再让每个结点(最后一个结点不用设置)的right设为下一个结点,left设为上一个结点。
1. python 的enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。返回 enumerate(枚举) 对象。
enumerate(sequence, [start=0]) 
2. a[:-1] 除了最后一个取全部。a[2::-1]) 取从下标为2的元素翻转读取。在“从头到尾打印链表”里,也有list切片操作。list[begin_idx: end_idx: step]对列表进行切片操作。从索引 begin_idx 开始,如果 step 为正则向右按 step 的值为步进切片至 end_idx 的前一个元素结束; 如果 step 为负则向左按 step 的值为步进切片至 end_idx 的前一个元素结束。arr[::-1]就是从头到尾按step=-1遍历,也就是从尾到头。
3. 别忘了self.arr清空
4. arr列表中的元素是链表节点,而且列表第一个元素就是双向链表头节点,所以直接返回 self.arr[0] 就相等于直接返回整个双向链表了。
# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    arr = []
    def Convert(self, pRootOfTree):
        # write code here
        if not pRootOfTree: return
        self.arr = []
        self.midTraversal(pRootOfTree)
        for index,node in enumerate(self.arr[:-1]):
            node.right = self.arr[index+1]
            self.arr[index+1].left = node
        return self.arr[0]
    def midTraversal(self,root):
        if not root: return
        self.midTraversal(root.left)
        self.arr.append(root)
        self.midTraversal(root.right)
直接遍历时修改指针:
# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Convert(self, pRootOfTree):
        if not pRootOfTree: return
        self.head = self.pre = None
        self.MidTraversal(pRootOfTree)
        return self.head
    def MidTraversal(self, root):
        if not root: return
        self.MidTraversal(root.left)
        if not self.head:
            self.head = self.pre = root
        else:
            self.pre.right, root.left, self.pre = root, self.pre, root
        self.MidTraversal(root.right)

全部评论

相关推荐

个人背景:学院二本计科专业 大二开始实习个人经历:安克创新 、理想汽车、字节跳动碎碎念:我做事只有三分钟热度。看到进了大厂的同学,我会羡慕,也会跟着努力上进;但遇到好看的小说,我又会放下手头的事沉迷其中,之前的坚持也就中断了。我有些自卑,总觉得自己学历和外貌都不够好。之前偶然在网上受到关注,我就喜欢上了上网,因为这里有很多人认可我。但我也很在意别人的评价,偶尔看到嘲讽的言论,会触发我的自卑情绪,让我感到愤怒。有时候我会强硬地回怼,有时候又会懦弱地选择无视。我也有虚荣心。不管是拿到安克、理想还是字节的机会,我在分享的时候都会带着这份心思。我会特意强调自己学历不好,是为了衬托出过程的艰难,以此显得自己更厉害。我知道,人往往会炫耀自己缺少的东西,来掩盖内心的空洞。我总想着走捷径,不太喜欢踏踏实实地做事。找实习的时候,我花了更多时间在研究面试技巧上,而不是提升专业能力。我会反复听面试录音分析技巧,看面试教程学习怎么和不同的面试官沟通,还会每天自言自语练习语言表达,同学都觉得我有点奇怪。我的实习生涯里,侥幸和运气占了很大一部分。我总在想,如果有一天我失去了这份幸运,这些特质可能会让我一蹶不振。ps: 很多人会问我学习路线和经验 但是就像我上面说的 我的实习过程靠的很多是关键节点的运气 技术上面我可能不如很多人  所以请大家理性求助和理性参考我的回答 附上我的投递记录
我的offer在哪里...:从去年看到现在,飞升哥就是榜样
我的求职进度条
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务