Problem
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 differ by more than 1.
Algorithm
Recursion. Divide the tree into two sub-trees in the middle.
Code
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def sortedListToBST(self, head: ListNode) -> TreeNode:
if not head:
return None
nums = []
p = head
while p:
nums.append(p.val)
p = p.next
numsL = len(nums)
if not numsL:
return []
def dfs(L, R):
if L > R:
return None
M = (L + R) // 2
L = dfs(L, M-1)
R = dfs(M+1, R)
return TreeNode(nums[M], L, R)
return dfs(0, numsL-1)