<
ARTS 第九周
>
上一篇

ARTS 第八周
下一篇

ARTS 第十周
Toc
ARTS Week-9

Algorithm

426. 将二叉搜索树转化为排序的双向链表

将一个二叉搜索树就地转化为一个已排序的双向循环链表。可以将左右孩子指针作为双向循环链表的前驱和后继指针。

为了让您更好地理解问题,以下面的二叉搜索树为例:

img1

我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。

img2

特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。

下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表示前驱关系。

img3

这道题没什么技巧,非常简单,只要知道搜索二叉树的性质(搜索二叉数中序遍历为降序有序数组。)就能做出来。


    """
    # Definition for a Node.
    class Node:
        def __init__(self, val, left, right):
            self.val = val
            self.left = left
            self.right = right
    """
    class Solution:
        def treeToDoublyList(self, root: 'Node') -> 'Node':
            if not root:
                return root
            
            nodes = []
            self._pre_order(root, nodes)
            
            length = len(nodes)
            
            for i in range(1, length):
                nodes[i - 1].right,  nodes[i].left = nodes[i], nodes[i - 1]
            
            nodes[0].left, nodes[-1].right = nodes[-1], nodes[0]
            
            return nodes[0]
        
        def _pre_order(self, root: 'Node', nodes: list) -> list:
            if not root:
                return
            
            if root.left:
                self._pre_order(root.left, nodes)
            
            nodes.append(root)
            
            if root.right:
                self._pre_order(root.right, nodes)

Review

NEAT ALGORITHMS - PAXOS

这篇文章用动画的形式去介绍了一致性算法 Paxos ,简洁易懂,推荐阅读!

img4

Tip

在 Mac 终端上我们可以利用快捷键 command + a 跳转到行首,和 command + e 跳转到行未,但是我们有时候只想往前或往后跳转一个跳一个单词(类似 Vimwb)。

在 Google 后发现,其实是有这个快捷键的,但是他竟然是 esc + b (向前跳一个单词)和 esc + f 向后跳一个单词。这对于我这种用 macbook pro 18 touch bar 款的情何以堪(对不起不是想秀电脑 🤪)。

于是再次 Google 后找到了方法,就是使用 iterm2 修改快捷键,方法如下:

img5

img6

img7

大功告成,最最后效果如下:

img8

Share

为什么“无人问津”的Lisp可以这么狂?

语言小剧场又开演了😂,个人觉得这个公众号里的这一类的文章非常有意思。

Top
Foot