Leetcode每日一题(20200818)

今日题目

T109 有序链表转二叉搜索树(中等,二叉树,分治)

题目描述

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

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

示例:

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

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

      0
     / \
   -3   9
   /   /
 -10  5

标签

二叉树,分治

解析

首先注意到给定的链表是从小到大排序好的。又已知二叉搜索树的中序遍历,其结果同样是从小到大的一个序列。结合这两点,我们可以大胆猜测:利用中序遍历的规律,我们可以把链表还原为二叉树。

对于任一链表,首先求出其长度,然后利用长度求中点,中点作为根节点,左右两边分别作为左右子树即可。注意题目给的是链表,因此head最好只进行一次从头到尾的移动。

C++解法

class Solution
{
public:
    int getLength(ListNode *head)
    {
        int ans = 0;
        for (; head != nullptr; ++ans, head = head->next)
            ;
        return ans;
    }
    TreeNode *build(ListNode *&head, int left, int right)
    {
        if (left > right)
        {
            return nullptr;
        }
        int mid = (left + right) >> 1;
        TreeNode *root = new TreeNode();
        root->left = build(head, left, mid - 1);
        root->val = head->val;
        head = head->next;
        root->right = build(head, mid + 1, right);
        return root;
    }
    TreeNode *sortedListToBST(ListNode *head)
    {
        int l = getLength(head);
        return build(head, 0, l - 1);
    }
};

python解法

class Solution:
    def sortedListToBST(self, head: ListNode) -> TreeNode:
        def getLength(head: ListNode) -> int:
            ans = 0
            while head:
                ans += 1
                head = head.next
            return ans

        def build(left: int, right: int) -> TreeNode:
            if left > right:
                return None
            mid = (left + right) // 2
            nonlocal head
            root = TreeNode()
            root.left = build(left, mid - 1)
            root.val = head.val
            head = head.next
            root.right = build(mid + 1, right)
            return root

        l = getLength(head)
        return build(0, l - 1)

备注

C++中注意引用的用法

你可能感兴趣的:(Leetcode每日一题汇总,二叉树,leetcode,python,c++)