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

Posted 风去幽墨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 36. 二叉搜索树与双向链表相关的知识,希望对你有一定的参考价值。

题目链接 :

https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/

题意:

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

题解:

二叉搜索树得到有序序列的方法:中序遍历
构建双向链表:cur.left,pre.right=pre,cur
所以最终需要在中序遍历的过程中去重复调整节点指向即可。
中序遍历过程中会不会因为改变节点指向导致中序遍历出错?
不会的,中序遍历的顺序是左-中-右,而进行节点指向调整的时候是在进行的,这时左子树已经全部调整好而且后续不会被使用;而且调整时只会cur.left,pre.right=pre,cur,即不会立刻改变当前节点的右指向,故不会导致中序遍历出错。

过程中需要将头尾节点保存下来单独调整指向。

代码:

"""
# Definition for a Node.
class Node:
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
"""
class Solution:
    def treeToDoublyList(self, root: 'Node') -> 'Node':
        def dfs(cur):
            if not cur:return
            dfs(cur.left)#递归左子树
            if self.pre:#判断是否为最小节点
                self.pre.right,cur.left = cur,self.pre
            else:#递归的最左节点时,self.pre仍未被赋值,所以当前节点为头节点
                self.head = cur
            self.pre =cur#维护调整节点的前继节点
            dfs(cur.right)#递归右子树

        if not root: return
        self.pre=None
        dfs(root)
        #此时self.pre 存储的是中序遍历后的最大节点
        self.pre.right,self.head.left = self.head,self.pre
        return self.head

以上是关于剑指 Offer 36. 二叉搜索树与双向链表的主要内容,如果未能解决你的问题,请参考以下文章

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

LeetCode(剑指 Offer)- 36. 二叉搜索树与双向链表

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

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

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

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