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. 使用canvas输出base64_url

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. python 爬虫简介以及使用方法

    阶段大纲: 一. 爬虫 1. 基本操作 - 登录任意网站(伪造浏览器的任何行为) 2. 性能相关 - 并发方案: - 异步IO: gevent/Twisted/asyncio/aiohttp - 自定 ...

  3. day01 三级菜单

    知识点: 字典, for 循环,if ...else 嵌套 永辉超市 = { '食品饮料':{ '休闲食品':{ '坚果':['山核桃','腰果'], '炒货':['瓜子','花生'] }, '牛奶' ...

  4. Oracle split分区表引起ORA-01502错误

    继上次删除分区表的分区遇到ORA-01502错误后[详细见链接:Oracle分区表删除分区引发错误ORA-01502: 索引或这类索引的分区处于不可用状态],最近在split分区的时候又遇到了这个问题 ...

  5. Spring知识点小结汇总

    Spring部分 1.谈谈你对spring IOC和DI的理解,它们有什么区别? IoC Inverse of Control 反转控制的概念,就是将原本在程序中手动创建UserService对象的控 ...

  6. 装饰器概念&实际使用干货

    定义: 本质是函数(装饰其他函数),是为其他函数添加附加功能 原则: 不能修改被装饰函数的源代码 不能修改被装饰函数的调用方式   实现装饰器知识储备: 函数及“变量” 高阶函数 把一个函数名当做实参 ...

  7. Mysql的TIMESTAMPDIFF和TIMESTAMPADD的用法

    [1.]TIMESTAMPDIFF(interval,colum1,colum2) 字段类型:date或者datetime 计算过程:colum2减去colum1,即后面的减去前面的 计算结果:整数 ...

  8. Python模块、包、异常、文件(案例)

    Python模块.包.异常.文件(案例) python.py #模块 # Python中的模块(Module),是一个Python文件,以.py文件结尾,包含了Python对象定义和Python语句, ...

  9. vuejs 解决跨域访问问题

    首先: config/index.js下面的proxyTable配置您的服务访问基本地址,将changeOrigin设置为true即可,然后在你需要访问接口的地方,这样使用,以下是我的工程代码(前提是 ...

  10. 【Java】集合概述Collection、Map

    Java集合分为Collection和Map,Collection又分为List.Set. List中有ArrayList.LinkedList和Vector:Set中又分为HashSet和TreeS ...