如何让Deep Code CLI先想清楚再动手:Plan Mode规划模式从入门到实战
2026/10/8 22:56:31
题目难度: 中等
原题链接
今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号算法精选里回复
剑指offer2就能看到该系列当前连载的所有文章了, 记得关注哦~
将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。
对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
特别地,我们希望可以 就地 完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中最小元素的指针。
O(N)O(N)classSolution:deftreeToDoublyList(self,root:'Node')->'Node':ifnotroot:returnNonedefgetDoublyList(root):ifnotroot:# 空节点对应的链表头尾也是空return(root,root)# 初始化左右子树对应链表的头和尾lhead,ltail,rhead,rtail=root,root,root,rootifroot.left:# 左子树存在时, 需要将根节点与左子树链表结尾相连lhead,ltail=getDoublyList(root.left)root.left=ltail ltail.right=rootifroot.right:# 右子树存在时, 需要将根节点与右子树链表开头相连rhead,rtail=getDoublyList(root.right)root.right=rhead rhead.left=root# 最后左链表开头和右链表结尾就是当前树转换的链表的头和尾return(lhead,rtail)# 将整个树转换的链表的头和尾相连, 形成循环链表head,tail=getDoublyList(root)head.left=tail tail.right=headreturnheadO(N)O(N)classSolution:deftreeToDoublyList(self,root:'Node')->'Node':ifnotroot:returnNoneself.pre=Nonedefinorder(node):ifnotnode:returninorder(node.left)ifnotself.pre:# 说明当前遍历到第一个节点, 也是最小的节点, 就是链表头self.head=nodeelse:# 将pre和node连起来self.pre.right=node node.left=self.pre# 更新pre为当前nodeself.pre=node inorder(node.right)inorder(root)# 注意遍历结束的时候的pre就是最后一个节点, 即链表尾, 需要和之前保存的链表头连起来, 形成循环链表self.head.left,self.pre.right=self.pre,self.headreturnself.head大家可以在下面这些地方找到我~😊
我的 GitHub
我的 Leetcode
我的 CSDN
我的知乎专栏
我的头条号
我的牛客网博客
我的公众号: 算法精选, 欢迎大家扫码关注~😊