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——有序链表转化二叉搜索树的更多相关文章

  1. Java实现 LeetCode 109 有序链表转换二叉搜索树

    109. 有序链表转换二叉搜索树 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. ...

  2. [LeetCode] 109. 有序链表转换二叉搜索树

    题目链接 : https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/ 题目描述: 给定一个单链表,其中的 ...

  3. LeetCode 109. 有序链表转换二叉搜索树(Convert Sorted List to Binary Search Tree)

    题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: ...

  4. LeetCode 中级 - 有序链表转换二叉搜索树(109)

    给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10 ...

  5. [LeetCode题解]109. 有序链表转换二叉搜索树 | 快慢指针 + 递归

    题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: ...

  6. LeetCode109. 有序链表转换二叉搜索树

    109. 有序链表转换二叉搜索树 问题描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超 ...

  7. LeetCode(109):有序链表转换二叉搜索树

    Medium! 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: ...

  8. [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 ...

  9. 有序链表转换二叉搜索树(LeetCode)

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

随机推荐

  1. OpenID Connect Core 1.0(二)ID Token

    2.ID Token(ID Token) OpenID Connect主要是对OAuth 2.0 能够使得终端用户通过ID Token的数据结构进行验证.当客户端和潜在的其他请求声明,ID Token ...

  2. Maven--archetypeCatalog笔记

    当我们使用maven原型生成项目骨架时,经常会在[INFO] Generating project in Interactive mode这个地方特别慢,这里并不是什么出错卡住的原因,你打开mvn的d ...

  3. Oracle子查询之简单子查询

    Oracle 简单子查询 顾名思义,简单子查询是嵌套在 SQL 语句中的另一个SELECT 语句,并且子查询只返回一列数据 1,单行子查询: 子查询 (内查询) 在主查询之前一次执行完成.子查询的结果 ...

  4. LeetCode 中级 - 优势洗牌(870)

    给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述. 返回 A 的任意排列,使其相对于 B 的优势最大化. 示例 2: 输入: ...

  5. CF1066D Boxes Packing(二分答案)

    题意描述: 你有$n$个物品,每个物品大小为$a_i$,$m$个盒子,每个盒子的容积为$k$.$Maksim$先生想把物品装入盒子中.对于每个物品,如果能被放入当前的盒子中,则放入当前盒子,否则换一个 ...

  6. Ubuntu下Zabbix结合percona监控mysql数据

    按道理来说zabbix就自带的MySQL插件来监控mysql数据库,但是你会发现,自带的mysql监控项是很少的,根本满足不了公司的需求.由于它本身自带的模板太过简单了,所以需要做更详细的监控,而pe ...

  7. CentOS7安装.Net Core2.2

    一.安装.Dotnet Core 2.2 Runtime Linux上运行Dotnet  Core程序的前提是安装Dotnet Core Runtime .Net Core对不同的Linux版本提示了 ...

  8. ajaxSubmit 在ie9或360兼容中,form下是空的

    解决办法:在<head>....</head>中加入<meta http-equiv="X-UA-Compatible" content=" ...

  9. webpack新建项目

    记录如何搭建一个最简单的能跑的项目! 1.首先,需要下载安装nodejs环境,可以直接百度搜索nodejs去官网下载符合你操作系统的环境. 安装完nodejs后,在控制台输入命令: npm -vers ...

  10. 企业SVN版本管理与代码上线方案

    1.SVN服务实战 1) 什么是SVN(Subversion)? Svn(subversion)是近年来崛起的非常优秀的版本管理工具,与CVS管理工具一样,SVN是一个跨平台的开源的版本控制系统.Sv ...