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

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

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

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

 

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

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

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

思路:

       这道题看起来很麻烦,实际上步骤很简单。我们知道二叉搜索树的性质就是中序遍历时,可以生成从小到大的排序。所以我们只需要先把这个课树按中序遍历展开,按顺序放入列表,然后再调整指针。

       当节点都在列表中时,再调整节点就容易很多了。我们不管是二叉搜索树还是双向链表,每个节点的指针都有两个,因此转换成双向链表时,我们依然操作节点原来的leftright指针就好。

代码:

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]#返回第一个节点

小结:

   一般提到二叉搜索树,我们首先要想到利用中序遍历将它变成有序型。这道题我们再通过列表来辅助我们进行指针的重建,就几乎不带任何难度地把二叉树转换成了双向链表。

posted @   JunanP  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示