剑指 Offer 36. 二叉搜索树与双向链表


输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。

 

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

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

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

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

利用二叉搜索树的中序遍历 即为排序后的值,按顺序生成链表即可

头节点:二叉搜索树中序遍历第一个节点 是最小元素即头节点

最后需要头尾互联,形成循环链表

class Solution:

    def treeToDoublyList(self, root: 'Node') -> 'Node':
        self.head = None
        self.pre = None

        def dfs(cur):
            if not cur:
                return
            dfs(cur.left)
            # 中序第一次访问到的节点为头节点
            if not self.head:
                self.head = cur
            if self.pre:
                cur.left = self.pre
                self.pre.right = cur
                self.pre = self.pre.right
            else:
                self.pre = cur
            dfs(cur.right)

        if not root:
            return None
        dfs(root)
        # 头尾互联构成循环链表
        self.head.left = self.pre
        self.pre.right = self.head
        return self.head
  • 作者:低调做个路人 (扫码联系作者)
  • 发表时间:2021-08-18 14:44:15
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 评论