将一个二叉搜索树就地转化为一个已排序的双向循环链表。可以将左右孩子指针作为双向循环链表的前驱和后继指针。
为了让您更好地理解问题,以下面的二叉搜索树为例:
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。
特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。
下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表示前驱关系。
这道题没什么技巧,非常简单,只要知道搜索二叉树的性质(搜索二叉数中序遍历为降序有序数组。)就能做出来。
"""
# 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)
这篇文章用动画的形式去介绍了一致性算法 Paxos ,简洁易懂,推荐阅读!
在 Mac 终端上我们可以利用快捷键 command + a
跳转到行首,和 command + e
跳转到行未,但是我们有时候只想往前或往后跳转一个跳一个单词(类似 Vim
的 w
和 b
)。
在 Google 后发现,其实是有这个快捷键的,但是他竟然是 esc + b
(向前跳一个单词)和 esc + f
向后跳一个单词。这对于我这种用 macbook pro 18 touch bar
款的情何以堪(对不起不是想秀电脑 🤪)。
于是再次 Google 后找到了方法,就是使用 iterm2
修改快捷键,方法如下:
大功告成,最最后效果如下:
语言小剧场又开演了😂,个人觉得这个公众号里的这一类的文章非常有意思。