[
linked list
bst
recursion
divide and conquer
]
Leetcode 0426 Convert Binary Search Tree to Sorted Doubly Linked List
Problem statement
https://leetcode.com/problems/convert-binary-search-tree-to-sorted-doubly-linked-list/
Solution
Construct doubly linked list L1 = lft_head...lft_tail for left subtree, L2 = rgh_head...rgh_head for right subtree and then combine them in one big doubly linked list L1 + root + L2 in O(1). When we have leafs, create one-elements double linked lists. Do not forget the cases, when we have only left or only right children.
Complexity
Time complexity is O(n), space complexity is O(h) due to recursion stack.
Code
class Solution:
def treeToDoublyList(self, root):
def dfs(node):
if node is None:
return None, None
lft_head, lft_tail = dfs(node.left)
rgh_head, rgh_tali = dfs(node.right)
if lft_head:
lft_tail.right = node
node.left = lft_tail
if rgh_head:
node.right = rgh_head
rgh_head.left = node
head = lft_head or node or rgh_head
tail = rgh_tali or node or lft_tail
return head, tail
if root is None: return None
head, tail = dfs(root)
tail.right = head
head.left = tail
return head
Remark
There is also solution with O(1) complexity using inorder traversal.
See problems 0108, 0109, which are opposite: we need to convert List (Single-Linked) to Balanced BST.