每天坚持刷题!!
题目要求
将一个二叉查找树按照中序遍历转换成双向链表。
题目分析
简单的思路是先用数组或是队列存储二叉查找树的中序遍历结果,然后从头到尾遍历生成双向链表,需要O(n)的时间和额外O(n)的空间,因为我们需要对二叉查找树的每一个节点生成对应的双向链表,所以时间复杂度不太可能下降,可以针对空间进行优化。
优化的思路是在进行二叉查找树中序遍历时就生成对应的双向链表的节点,那么因为是进行中序遍历,所以双向链表的起点要么是根节点左子树的最小值,要么是根节点(在根节点没有左子树的时候);其次稍加分析我们可以知道对于节点的左子树递归时返回左子树的中序遍历的最后一个节点,对于节点的右子树返回中序遍历的第一个节点,以此我们可以用递归的方式解决问题
def bstToDoublyList(self, root):
# write your code here
if not root:
return
if root.left is None and root.right is None:
return DoublyListNode(root.val)
head = [None]
def recur_build_double_list(root, type='all'):
if root is None:
return
if root.left is None and root.right is None:
temp = DoublyListNode(root.val)
if head[0] is None:
head[0] = temp
return temp
temp_node = DoublyListNode(root.val)
temp_node.prev = recur_build_double_list(root.left, type='left')
if temp_node.prev:
temp_node.prev.next = temp_node
if not temp_node.prev: # 防止左子树为空
if head[0] is None:
head[0] = temp_node
temp_node.next = recur_build_double_list(root.right, type='right')
if temp_node.next:
temp_node.next.prev = temp_node
if type == 'left':
while temp_node.next:
temp_node = temp_node.next
elif type == 'right':
while temp_node.prev:
temp_node = temp_node.prev
return temp_node
recur_build_double_list(root)
return head[0]