剑指Offer 二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
为了让您更好地理解问题,以下面的二叉搜索树为例:
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。
特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。
思路:
这道题看起来很麻烦,实际上步骤很简单。我们知道二叉搜索树的性质就是中序遍历时,可以生成从小到大的排序。所以我们只需要先把这个课树按中序遍历展开,按顺序放入列表,然后再调整指针。
当节点都在列表中时,再调整节点就容易很多了。我们不管是二叉搜索树还是双向链表,每个节点的指针都有两个,因此转换成双向链表时,我们依然操作节点原来的left和right指针就好。
代码:
class Solution(object):
def treeToDoublyList(self, root):
if not root:
return None
node_list = list()
#中序遍历用node_list存储所有节点
def zhongxu(root):
if not root:return
zhongxu(root.left)#左
node_list.append(root)#中
zhongxu(root.right) #右
zhongxu(root)
#现在操作列表就简单多了
length = len(node_list)
#线性遍历 两两相连
for i in range(length-1):
node_list[i].right=node_list[i+1]#前面的指向后面的
node_list[i+1].left=node_list[i]#后面的指向前面的
#首尾再连一下
node_list[0].left=node_list[-1]
node_list[-1].right=node_list[0]
return node_list[0]#返回第一个节点
小结:
一般提到二叉搜索树,我们首先要想到利用中序遍历将它变成有序型。这道题我们再通过列表来辅助我们进行指针的重建,就几乎不带任何难度地把二叉树转换成了双向链表。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了