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

二叉搜索树与双向链表

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)

全部评论

相关推荐

风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
双非有机会进大厂吗
点赞 评论 收藏
分享
认真搞学习:28小登的建议,投算法岗不要写什么物理竞赛,互联网+,多写点项目,用什么算法做了什么。还有本科算法是不可能的开发你这个也没有项目啊
点赞 评论 收藏
分享
感觉他们一点都不了解现在这个社会就业有多难,已经在牛客刷到好多篇 延毕的帖子了,延毕就会导致已经找好的工作就没了,还得重新再找,学校和老师们是怎么想的呢????看到学生丢失工作会开心吗 就业数据都在造假,真实的就业困难不去解决 一个个真是好样的
从明天开始狠狠卷JV...:学生看到的是导师不放实习导致offer黄了。 导师看到的是招进来的学生吃自己补助和自己的招生名额,却没给自己升迁带来任何帮助,还要跑路。 根本利益的不一致,最主要留校的导师大概率是职场上招聘失败的,被迫留校的,什么牛鬼蛇神都会有
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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