面试题36. 二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
思路:中序遍历,其它技巧未掌握,后面多看几遍,看看有什么收获。

本题带入三个节点的二叉树:
             5
             / \
            4   8
结果如下:
               5
             // \\
(self.head) 4  = 8(self.pre)
# 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 __init__(self):
        self.head, self.pre = None, None
    def treeToDoublyList(self, root: 'Node') -> 'Node':
        if not root:
            return None
        # 二叉搜索树的中序遍历是递增的,因此把标准中序遍历中 改变每个父节点的左右指向即可
        # head, pre, tail = None,None,None # 不是集合,要在def里引用的话得放在__init__(self)里
        def inorder(node=root):
            if node:
                # 中序遍历,先left
                inorder(node.left)
				
				# 中间部分重点理解记忆
				#1.当self.pre为空的时候,用head记录头节点
				#2.否则就是建立双向链表操作
				#3.最后移动pre到当前node
                # 中序遍历,然后父节点
                if not self.pre:
                    self.head = node #记录初始头节点
                else:
                    self.pre.right, node.left = node, self.pre # 按顺序链接节点
                self.pre = node
                
                # 中序遍历,最后 right
                inorder(node.right)
        inorder()
        self.head.left, self.pre.right =  self.pre, self.head # 链接首位节点,跳出递归的pre是最后一个节点
        return self.head
a = Node('2')
b = Node('1')
c = Node('3')
a.left = b
a.right = c
Solution().treeToDoublyList(a)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章