109. 有序链表转换二叉搜索树 && 108. 将有序数组转换为二叉搜索树

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定的有序链表: [-10, -3, 0, 5, 9],

一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:

      0
     / \
   -3   9
   /   /
 -10  5

思考:

前置信息:BST,升序的链表,平衡二叉树

这里突破点是平衡二叉树,给一个链表怎么构建平衡二叉树?先找到中间,在递归的处理左右两边即可

class Solution(object):
    def sortedListToBST(self, head):
        def findmid(head,tail):
            slow = head
            fast = head
            while fast!=tail and fast.next!=tail:
                slow = slow.next
                fast = fast.next.next
            return slow
        def helper(head,tail):
            if head == tail:
                return 
            node = findmid(head,tail)
            root = TreeNode(node.val)
            root.left = helper(head,node)
            root.right = helper(node.next,tail)
            return root
        return helper(head,None)

有序数组
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def sortedArrayToBST(self, nums):
        """
        :type nums: List[int]
        :rtype: TreeNode
        """
        def helper(left, right):
            if left > right:
                return None

            # always choose left middle node as a root
            p = (left + right) // 2

            # inorder traversal: left -> node -> right
            root = TreeNode(nums[p])
            root.left = helper(left, p - 1)
            root.right = helper(p + 1, right)
            return root
        
        return helper(0, len(nums) - 1)
发布了200 篇原创文章 · 获赞 17 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_36328915/article/details/104464928
今日推荐