描述

  • 给定一个有序列表,将其转换成为一个平衡搜索二叉树
  • 题不难,不过在讨论中发现此题的中序遍历用法略有不同,感觉有点意思
  • 手写一遍加深印象
  • 暴力解法,链表转数组,额外空间O(N),递归遍历搞定。几分钟解决,但显然不是最优。
  • 其次思考类似于红黑树进行节点旋转,后来发现成本较高。
  • 到讨论区发现solution-2的解法:计数得到节点总数,知道节点数就可以确定一种满足要求的BST结构,然后使用中序遍历,将列表元素填入BST对应节点。

Description

109. Convert Sorted List to Binary Search Tree
Medium 2382 90 Add to List Share
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. Example 1: Input: head = [-10,-3,0,5,9]
Output: [0,-3,9,-10,null,5]
Explanation: One possible answer is [0,-3,9,-10,null,5], which represents the shown height balanced BST. Example 2: Input: head = []
Output: [] Example 3: Input: head = [0]
Output: [0] Example 4: Input: head = [1,3]
Output: [3,1] Constraints: The number of nodes in head is in the range [0, 2 * 104].
-10^5 <= Node.val <= 10^5

Solution-1

  • traversal the list and add all elements into a array
  • then convert this problem to 108_convert_sorted_array_to_binary_search_tree.
  • time cost : O(N) + O(N) + O(N) ~ O(N) : traversal the list + recursive construct tree + read the elements in list
  • space cost : O(N) + O(logN) ~ O(N) : array space and recursive stack cost.
AC Result
  • Runtime: 132 ms, faster than 47.94% of Python online submissions for Convert Sorted List to Binary Search Tree.
  • Memory Usage: 25.5 MB, less than 21.90% of Python online submissions for Convert Sorted List to Binary Search Tree.
show me the code
    def sortedArrayToBST(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
Runtime: 52 ms, faster than 99.19% of Python online submissions for Convert Sorted Array to Binary Search Tree.
Memory Usage: 17 MB, less than 35.16% of Python online submissions for Convert Sorted Array to Binary Search Tree.
"""
nums_len = len(nums)
if(nums_len == 0):
return None
if(nums_len == 1):
return TreeNode(nums[0])
mid = nums_len / 2
root = TreeNode(nums[mid])
root.left = self.sortedArrayToBST(nums[0:mid])
root.right = self.sortedArrayToBST(nums[mid + 1 :])
return root def sortedListToBST(self, head):
"""
:type head: ListNode
:rtype: TreeNode
Runtime: 132 ms, faster than 47.94% of Python online submissions for Convert Sorted List to Binary Search Tree.
Memory Usage: 25.5 MB, less than 21.90% of Python online submissions for Convert Sorted List to Binary Search Tree.
"""
head_arr = []
cur_point = head
while(cur_point):
head_arr.append(cur_point.val)
cur_point = cur_point.next
return self.sortedArrayToBST(head_arr)

Solution-2

  • inorder Traversal to fill all elements in list in a new tree construct by recursive.

    how to understand this solution:
  1. we count all elements in list so that we can know the tree constructure which corresponds the conditions of BST
  2. inorder traversal the specified BST
  3. fill the elements in list into the target tree.

    this is mean we traversal the tree by inorder function, fill the sorted elements at specified positions.
  • time cost : O(N) + O(N) + O(N) ~ O(N) : traversal the list + recursive construct tree + read the elements in list

  • space cost : O(1) + O(logN) ~ O(logN) : recursive stack cost.

AC Result
  • Runtime: 124 ms, faster than 80.95% of Python online submissions for Convert Sorted List to Binary Search Tree.
  • Memory Usage: 25.7 MB, less than 21.90% of Python online submissions for Convert Sorted List to Binary Search Tree.
show me the code

def sortedListToBST(self, head):
if(None == head):
return None
cur_point = head
head_count = 0
while(cur_point):
head_count += 1
cur_point = cur_point.next
self.cur_point = head
return self.inner_sorted_list_to_bst(1, head_count) def inner_sorted_list_to_bst(self, start_idx, end_idx):
'''
inorder Traversal to fill all elements in list in a new tree construct by recursive.
how to understand this solution:
1. we count all elements in list so that we can know the tree constructure which corresponds the conditions of BST
2. inorder traversal the specified BST
3. fill the elements in list into the target tree.
this is mean we traversal the tree by inorder function, fill the sorted elements at specified positions.
Runtime: 124 ms, faster than 80.95% of Python online submissions for Convert Sorted List to Binary Search Tree.
Memory Usage: 25.7 MB, less than 21.90% of Python online submissions for Convert Sorted List to Binary Search Tree.
:param start_idx:
:param end_idx:
:return:
'''
if(start_idx > end_idx):
return None
mid_idx = start_idx + (end_idx - start_idx)/2
left = self.inner_sorted_list_to_bst(start_idx, mid_idx -1)
root = TreeNode(self.cur_point.val)
root.left = left
self.cur_point = self.cur_point.next
root.right = self.inner_sorted_list_to_bst(mid_idx +1 , end_idx)
return root

由有序链表构建平衡二叉搜索树-sortedListToBST的更多相关文章

  1. [LeetCode] 109. Convert Sorted List to Binary Search Tree 把有序链表转成二叉搜索树

    Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...

  2. Convert Sorted List to Binary Search Tree——将链表转换为平衡二叉搜索树 &&convert-sorted-array-to-binary-search-tree——将数列转换为bst

    Convert Sorted List to Binary Search Tree Given a singly linked list where elements are sorted in as ...

  3. [LeetCode] 108. Convert Sorted Array to Binary Search Tree 把有序数组转成二叉搜索树

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. Fo ...

  4. convert sorted list to binary search tree(将有序链表转成平衡二叉搜索树)

    Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...

  5. LeetCode 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树

    第108题 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10 ...

  6. 看动画学算法之:平衡二叉搜索树AVL Tree

    目录 简介 AVL的特性 AVL的构建 AVL的搜索 AVL的插入 AVL的删除 简介 平衡二叉搜索树是一种特殊的二叉搜索树.为什么会有平衡二叉搜索树呢? 考虑一下二叉搜索树的特殊情况,如果一个二叉搜 ...

  7. Java实现平衡二叉搜索树(AVL树)

    上一篇实现了二叉搜索树,本章对二叉搜索树进行改造使之成为平衡二叉搜索树(Balanced Binary Search Tree). 不平衡的二叉搜索树在极端情况下很容易退变成链表,与新增/删除/查找时 ...

  8. 二叉搜索树、AVL平衡二叉搜索树、红黑树、多路查找树

    1.二叉搜索树 1.1定义 是一棵二叉树,每个节点一定大于等于其左子树中每一个节点,小于等于其右子树每一个节点 1.2插入节点 从根节点开始向下找到合适的位置插入成为叶子结点即可:在向下遍历时,如果要 ...

  9. LeetCode--108--将有序数组转化为二叉搜索树

    问题描述: 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10 ...

  10. 算法:非平衡二叉搜索树(UnBalanced Binary Search Tree)

    背景 很多场景下都需要将元素存储到已排序的集合中.用数组来存储,搜索效率非常高: O(log n),但是插入效率比较低:O(n).用链表来存储,插入效率和搜索效率都比较低:O(n).如何能提供插入和搜 ...

随机推荐

  1. Prism Sample 13-IActiveAwareCommands

    本例和12的唯一区别,仅仅是在ViewModel中增加了一个IActiveAware,这决定了只有在Acitve状态的视图中才会执行自己ViewModel中的命令.

  2. VueUse 是怎么封装Vue3 Provide/Inject 的?

    Provide/Inject Provide 和 Inject 可以解决 Prop 逐级透传问题.注入值类型不会使注入保持响应性,但注入一个响应式对象,仍然有响应式的效果. Provide 的问题是无 ...

  3. 2022-12-21:uifd/ui-for-docker是docker的web可视化工具。请问部署在k3s中,yaml文件如何写?

    2022-12-21:uifd/ui-for-docker是docker的web可视化工具.请问部署在k3s中,yaml文件如何写? 答案2022-12-21: yaml如下: apiVersion: ...

  4. 2022-05-20:给定一个正数数组arr,长度为N,依次代表N个任务的难度,给定一个正数k, 你只能从0任务开始,依次处理到N-1号任务结束,就是一定要从左往右处理任务, 只不过,难度差距绝对值不

    2022-05-20:给定一个正数数组arr,长度为N,依次代表N个任务的难度,给定一个正数k, 你只能从0任务开始,依次处理到N-1号任务结束,就是一定要从左往右处理任务, 只不过,难度差距绝对值不 ...

  5. windows-重启打印服务

    @echo off color a net stop spooler net start spooler ping -n 4 localhost >nul

  6. es笔记三之term,match,match_phrase 等查询方法介绍

    本文首发于公众号:Hunter后端 原文链接:es笔记三之term,match,match_phrase 等查询方法介绍 首先介绍一下在 es 里有两种存储字符串的字段类型,一个是 keyword,一 ...

  7. AcWing 278. 数字组合

    给定 N 个正整数 A1,A2,-,AN,从中选出若干个数,使它们的和为 M,求有多少种选择方案. 输入格式 第一行包含两个整数 N 和 M. 第二行包含 N 个整数,表示 A1,A2,-,AN. 输 ...

  8. .Net后台调用js,提示、打开新窗体、关闭当前窗体

    .Net后台调用js,提示.关闭当前窗体.打开新窗体 Response.Write("<script>window.alert('支付成功!');window.open('/Jk ...

  9. 图扑虚拟现实 VR 智慧办公室可视化

    前言 "虚拟现实"是来自英文"Virtual Reality",简称 VR 技术,其是通过利用计算机仿真系统模拟外界环境,主要模拟对象有环境.技能.传感设备和感 ...

  10. 如何判断Keil MDK ARM中已经破解?如何判断Keil MDK ARM中已经安装了相应的器件库?如何判断CubeMX的器件库已经安装成功?

    如何判断CubeMX的器件库已经安装成功?请对照下图 如何判断Keil MDK ARM中已经安装了相应的器件库?请看下图 如何判断CubeMX的器件库已经安装成功?请对照下图