LeetCode 109. Convert Sorted List to Binary Search Tree
考点 | 难度 |
---|---|
DP | Medium |
题目
Given the head of a singly linked list where elements are sorted in ascending order, convert it to a height-balanced binary search tree.
思路
1 linked list -> array, 或者用Floyd’s Cycle Detection Algorithm找到中间点,然后recursively build tree (subtrees)
2 iterate through the linked list to count the total number of nodes (count) -> use inorder tree traversal to force our access to go in iterative order (代替用array的index) 注意需要have our list pointer (curr) have global scope (move curr to curr.next at the end of processing the middle node)
https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/discuss/1194228/JS-Python-Java-C%2B%2B-or-Easy-Recursive-Solution-w-Explanation
答案
class Solution:
def sortedListToBST(self, head: ListNode) -> TreeNode:
curr, count = head, 0
while curr:
curr = curr.next
count += 1
def treeify(i: int, j: int) -> TreeNode:
if j < i: return None
mid, node = i + j >> 1, TreeNode()
node.left = treeify(i, mid - 1)
node.val, curr[0] = curr[0].val, curr[0].next
node.right = treeify(mid + 1, j)
return node
curr = [head]
return treeify(1, count)