0109. Convert Sorted List to Binary Search Tree
Medium | Binary Search Tree + Inorder Traversal | 108 ms (99.14%), 25.4 MB (58.06%)
Source: LeetCode - Convert Sorted List to Binary Search Tree GitHub: Solution / Performance
Given the head
of a singly linked list where elements are sorted in ascending order, convert it to a height-balanced BST.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differs by more than 1.
Based on the above understanding, we could use two indexes "Start and End" to simulate inorder traversal recursively by the DFS method.
Besides, whenever we meet a left-child node, we record the current head node's value and then move the head node to the next node before finding the right-child node so that each node's value is assigned in an inorder traversal manner.
# pseudo code
mid = (start + end) // 2
leftNode = dfs(start, mid - 1)
val = head.val
head = head.next
rightNode = dfs(mid + 1, end)
node = TreNode(val, left, right)
return node

class Solution:
def sortedListToBST(self, head: ListNode) -> TreeNode:
# (base case)
if not head: return None
if not head.next: return TreeNode(head.val)
# ==================================================
# Linked List + Tree + In-order Recursion =
# ==================================================
# time : O(n)
# space : O(log(n)) due to height-balanced BST
cur, size = head, 0
while cur:
size += 1
cur = cur.next
self.head = head
return self.inOrder(0, size - 1)
def inOrder(self, start: int, end: int) -> TreeNode:
if start > end: return None
mid = (start + end) // 2
left = self.inOrder(start, mid - 1)
val = self.head.val
self.head = self.head.next
right = self.inOrder(mid + 1, end)
node = TreeNode(val, left, right)
return node
Last updated
Was this helpful?