由有序链表构建平衡二叉搜索树-sortedListToBST
描述
- 给定一个有序列表,将其转换成为一个平衡搜索二叉树
- 题不难,不过在讨论中发现此题的中序遍历用法略有不同,感觉有点意思
- 手写一遍加深印象
- 暴力解法,链表转数组,额外空间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:
- we count all elements in list so that we can know the tree constructure which corresponds the conditions of BST
- inorder traversal the specified BST
- 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的更多相关文章
- [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 ...
- 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 ...
- [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 ...
- 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 ...
- LeetCode 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树
第108题 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10 ...
- 看动画学算法之:平衡二叉搜索树AVL Tree
目录 简介 AVL的特性 AVL的构建 AVL的搜索 AVL的插入 AVL的删除 简介 平衡二叉搜索树是一种特殊的二叉搜索树.为什么会有平衡二叉搜索树呢? 考虑一下二叉搜索树的特殊情况,如果一个二叉搜 ...
- Java实现平衡二叉搜索树(AVL树)
上一篇实现了二叉搜索树,本章对二叉搜索树进行改造使之成为平衡二叉搜索树(Balanced Binary Search Tree). 不平衡的二叉搜索树在极端情况下很容易退变成链表,与新增/删除/查找时 ...
- 二叉搜索树、AVL平衡二叉搜索树、红黑树、多路查找树
1.二叉搜索树 1.1定义 是一棵二叉树,每个节点一定大于等于其左子树中每一个节点,小于等于其右子树每一个节点 1.2插入节点 从根节点开始向下找到合适的位置插入成为叶子结点即可:在向下遍历时,如果要 ...
- LeetCode--108--将有序数组转化为二叉搜索树
问题描述: 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10 ...
- 算法:非平衡二叉搜索树(UnBalanced Binary Search Tree)
背景 很多场景下都需要将元素存储到已排序的集合中.用数组来存储,搜索效率非常高: O(log n),但是插入效率比较低:O(n).用链表来存储,插入效率和搜索效率都比较低:O(n).如何能提供插入和搜 ...
随机推荐
- 2021-12-01:给定一个正数数组arr,代表每个人的体重。给定一个正数limit代表船的载重,所有船都是同样的载重量。 每个人的体重都一定不大于船的载重。 要求: 1, 可以1个人单独一搜船;
2021-12-01:给定一个正数数组arr,代表每个人的体重.给定一个正数limit代表船的载重,所有船都是同样的载重量. 每个人的体重都一定不大于船的载重. 要求: 1, 可以1个人单独一搜船: ...
- 数字分频器设计(偶数分频、奇数分频、小数分频、半整数分频、状态机分频|verilog代码|Testbench|仿真结果)
目录 一.前言 二.偶数分频 2.1 触发器级联法 2.2 计数器法 2.3 verilog代码 2.4 Testbench 2.5 仿真结果 三.奇数分频 3.1 占空比非50%奇数分频 3.2 占 ...
- Python连接es笔记一之连接与查询es
本文首发于公众号:Hunter后端 原文链接:Python连接es笔记一之连接与查询es 有几种方式在 Python 中配置与 es 的连接,最简单最有用的方法就是定义一个默认的连接,如果系统不是需要 ...
- liunx操作系统下配置服务器
centos7 下配置服务器基本步骤 1,yum install 服务器名称 2,关闭防火墙,配置服务器配置文件,开启服务, 3,创建文件,设置访问权限, 4,本地登陆,测试服务器能否连通
- vs2022的一些调试技巧——远程调试&线程检查&性能检查
visual studio一直都是.net/c#开发人员最受欢迎的编译器,除了强大的代码提示和项目模板,还拥有大量的调试工具,这一期我们介绍下code freeze阶段的一些调试技巧.包括测试环境/生 ...
- FPGA加速技术在人机交互界面中的应用及优化
目录 引言 随着人工智能.云计算.大数据等技术的发展,人机交互界面的重要性也越来越凸显.作为用户与计算机之间的桥梁,人机交互界面的性能和效率直接影响用户的体验和使用效果.为了优化人机交互界面的性能,我 ...
- .NET周报 【6月第4期 2023-06-25】
国内文章 如何在long-running task中调用async方法 https://www.cnblogs.com/eventhorizon/p/17497359.html long-runnin ...
- 2023-06-29:redis中什么是热点Key?该如何解决?
2023-06-29:redis中什么是热点Key?该如何解决? 答案2023-06-29: 在Redis中,经常被访问的key被称为热点key. 产生原因和危害 原因 热点key问题产生的原因可以归 ...
- PHP站群询盘订单提交过滤系统,2018年作品
//作者主页: https://www.bz80.vip header("Content-type: text/html; charset=utf-8"); //UTF8编码,避免 ...
- 自然语言处理 Paddle NLP - 开放域对话系统-理论
常见的对话系统 个人助手 •Apple Siri, Amazon Alexa, Baidu Xiaodu 客户服务•餐厅预定.商品咨询.债务催收 休闲娱乐 •Microsoft XiaoIce,Rep ...