LCR 155:将二叉搜索树转化为排序的双向链表

问题

将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 ;节点的左指针指向前驱(上一个比自己小的节点),右指针指向后驱(下一个比自己大的节点)。

最后要求返回链表中最小元素的指针。

在这里插入图片描述

思考

题目的要求贼多:

  1. 排序:二叉树的中序遍历结果是一个有序的数组,因此,根据这个要求我们可以推出,本题的遍历要用中序遍历;
  2. 就地:如果没有这个要求,中序遍历了,再构建一个新的树就行了;
  3. 双向链表:右子树指向大的,左子树指向小的;
  4. 循环:首尾还得接起来;
  5. 返回链表中最小元素的指针

我第一次没有写出来,虽然是中序遍历,但是不知道咋写,后面男票讲了一遍才理解到,这里再码一遍加深理解:

class Solution:
    def traverse(self, cur: 'Node') -> 'Node':
        if not cur:
            return
        self.traverse(cur.left)
        # 关键代码
        if self.pre:
            self.pre.right, cur.left = cur, self.pre
        else:
            self.head = cur
        self.pre = cur
        self.traverse(cur.right)

        return self.head

    def treeToDoublyList(self, root: 'Node') -> 'Node':
        if not root:
            return root
        # 为了记录上一个节点,从而连接双向链表
        self.pre = None
        self.traverse(root)
        # 为了形成循环,首尾再接一下
        self.head.left, self.pre.right = self.pre, self.head

        return self.head

之前知道要中序遍历,代码的结构应该是:

if not root:
	return root
traverse(root.left)
???
traverse(root.right)

但是❓部分要怎么写就不知道了,现在总结下,应该去怎么想这种问题。

这是一种递归的写法,最开始进入到return的,一定是最左边的节点,也就是下图的1号节点(因为1号节点的left为空,会首先命中if not root,返回空)。
在这里插入图片描述

然后就到了❓的部分,这个时候的root值为1,也是我们想返回的最小节点。怎么把它记录下来呢?通过一个if self.pre是不是空的条件,也就是是不是初始化的状态,是的话记下这个最小节点,留着最后返回。不是的话,说明已经不在1号节点了,这时候的核心任务就是更改双向的指针。

更改指针的时候,假设我们在2号,它的pre应该是1,left和right千万不要搞反了就行。更改完记得更新一下pre的值,因为要进入下一个节点了。

最后一个容易遗漏也容易写错的地方,就是首尾相接的部分。首节点的right已经指向了比它大的,尾节点的left已经指向了比它小的,所以最后连的是self.head.left,self.pre.right !

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-28 11:54:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-28 11:54:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-28 11:54:03       87 阅读
  4. Python语言-面向对象

    2024-03-28 11:54:03       96 阅读

热门阅读

  1. 【QT学习笔记】目录 (不定时更新)

    2024-03-28 11:54:03       45 阅读
  2. php程序员如何成为编程高手

    2024-03-28 11:54:03       38 阅读
  3. Vue 实践中的理解

    2024-03-28 11:54:03       38 阅读
  4. Vue 模版编译原理

    2024-03-28 11:54:03       45 阅读
  5. 调用第三方接口:springBoot整合forest

    2024-03-28 11:54:03       48 阅读
  6. 使用vue根据表格内容生成Excel表格并下载

    2024-03-28 11:54:03       41 阅读
  7. 网站建设服务器怎么选

    2024-03-28 11:54:03       47 阅读
  8. 函数 GetMemoryType 的理解

    2024-03-28 11:54:03       41 阅读
  9. linux进程切换

    2024-03-28 11:54:03       45 阅读