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