LeetCode 109——有序链表转化二叉搜索树
1. 题目
2. 解答
2.1. 方法一
在 LeetCode 108——将有序数组转化为二叉搜索树 中,我们已经实现了将有序数组转化为二叉搜索树。因此,这里,我们可以先遍历一遍链表,将节点的数据存入有序数组中,然后再将有序数组转化为二叉搜索树即可。
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
vector<int> nums;
while (head != NULL)
{
nums.push_back(head->val);
head = head->next;
}
return sortedArrayToBST(nums, 0, nums.size()-1);
}
TreeNode* sortedArrayToBST(vector<int>& nums, int begin, int end) {
if (end < begin) return NULL; // 数组为空
int mid = begin + (end - begin) / 2;
TreeNode * tree = new TreeNode(nums[mid]); // 中值作为根节点
tree->left = sortedArrayToBST(nums, begin, mid-1); // 左子树
tree->right = sortedArrayToBST(nums, mid+1, end); // 右子树
return tree;
}
};
2.2. 方法二
将有序数组转化为二叉搜索树的核心思想就是找到数组的中间数据,以此为根节点,然后再递归建立左右子树。因此,借助于 LeetCode 876——链表的中间结点 中的思想,我们可以快速地找到链表的中间节点,然后再以中间节点前后的两个子链分别建立左右子树即可。
如下图所示,当 slow 指针指向中间节点时,last 指针指向中间节点的上一个节点,slow->next 是右子链的头结点,而将 last->next 指向 NULL 后,左子链的头节点即为 head。
此外,要注意一种特殊情况,当只有一个节点时,此时 last、slow、fast 都指向这个节点,那么左子链此时应为空。
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
ListNode* last = head;
ListNode* slow = head;
ListNode* fast = head;
// 循环结束时慢指针指向中间结点
while(fast && fast->next)
{
last = slow;
slow = slow->next;
fast = fast->next->next;
}
if (slow == NULL) return NULL;
TreeNode * tree = new TreeNode(slow->val); // 中值作为根节点
if (last == slow) tree->left = NULL;
else
{
last->next = NULL;
tree->left = sortedListToBST(head); // 左子树
}
tree->right = sortedListToBST(slow->next); // 右子树
return tree;
}
};
获取更多精彩,请关注「seniusen」!
LeetCode 109——有序链表转化二叉搜索树的更多相关文章
- Java实现 LeetCode 109 有序链表转换二叉搜索树
109. 有序链表转换二叉搜索树 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. ...
- [LeetCode] 109. 有序链表转换二叉搜索树
题目链接 : https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/ 题目描述: 给定一个单链表,其中的 ...
- LeetCode 109. 有序链表转换二叉搜索树(Convert Sorted List to Binary Search Tree)
题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: ...
- LeetCode 中级 - 有序链表转换二叉搜索树(109)
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10 ...
- [LeetCode题解]109. 有序链表转换二叉搜索树 | 快慢指针 + 递归
题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: ...
- LeetCode109. 有序链表转换二叉搜索树
109. 有序链表转换二叉搜索树 问题描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超 ...
- LeetCode(109):有序链表转换二叉搜索树
Medium! 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: ...
- [LeetCode] 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)
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...
随机推荐
- OpenID Connect Core 1.0(二)ID Token
2.ID Token(ID Token) OpenID Connect主要是对OAuth 2.0 能够使得终端用户通过ID Token的数据结构进行验证.当客户端和潜在的其他请求声明,ID Token ...
- Maven--archetypeCatalog笔记
当我们使用maven原型生成项目骨架时,经常会在[INFO] Generating project in Interactive mode这个地方特别慢,这里并不是什么出错卡住的原因,你打开mvn的d ...
- Oracle子查询之简单子查询
Oracle 简单子查询 顾名思义,简单子查询是嵌套在 SQL 语句中的另一个SELECT 语句,并且子查询只返回一列数据 1,单行子查询: 子查询 (内查询) 在主查询之前一次执行完成.子查询的结果 ...
- LeetCode 中级 - 优势洗牌(870)
给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述. 返回 A 的任意排列,使其相对于 B 的优势最大化. 示例 2: 输入: ...
- CF1066D Boxes Packing(二分答案)
题意描述: 你有$n$个物品,每个物品大小为$a_i$,$m$个盒子,每个盒子的容积为$k$.$Maksim$先生想把物品装入盒子中.对于每个物品,如果能被放入当前的盒子中,则放入当前盒子,否则换一个 ...
- Ubuntu下Zabbix结合percona监控mysql数据
按道理来说zabbix就自带的MySQL插件来监控mysql数据库,但是你会发现,自带的mysql监控项是很少的,根本满足不了公司的需求.由于它本身自带的模板太过简单了,所以需要做更详细的监控,而pe ...
- CentOS7安装.Net Core2.2
一.安装.Dotnet Core 2.2 Runtime Linux上运行Dotnet Core程序的前提是安装Dotnet Core Runtime .Net Core对不同的Linux版本提示了 ...
- ajaxSubmit 在ie9或360兼容中,form下是空的
解决办法:在<head>....</head>中加入<meta http-equiv="X-UA-Compatible" content=" ...
- webpack新建项目
记录如何搭建一个最简单的能跑的项目! 1.首先,需要下载安装nodejs环境,可以直接百度搜索nodejs去官网下载符合你操作系统的环境. 安装完nodejs后,在控制台输入命令: npm -vers ...
- 企业SVN版本管理与代码上线方案
1.SVN服务实战 1) 什么是SVN(Subversion)? Svn(subversion)是近年来崛起的非常优秀的版本管理工具,与CVS管理工具一样,SVN是一个跨平台的开源的版本控制系统.Sv ...