给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定的有序链表: [-10, -3, 0, 5, 9],

一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:

      0
/ \
-3 9
/ /
-10 5




/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
/*
算法思想:
和之前那道将有序数组转为二叉搜索树思路完全一样,只不过是操作的数据类型有所差别,一个是数组,一个是链表。数组方便就方便在可以通过index直接访问任意一个元素,而链表不行。由于二分查找法每次需要找到中点,而链表的查找中间点可以通过快慢指针来操作,找到中点后,要以中点的值建立一个数的根节点,然后需要把原链表断开,分为前后两个链表,都不能包含原中节点,然后再分别对这两个链表递归调用原函数,分别连上左右子节点即可。
*/
class Solution {
public:
TreeNode *sortedListToBST(ListNode *head) {
if (!head)
return NULL;
if (!head->next)
return new TreeNode(head->val);
ListNode *slow = head;
ListNode *fast = head;
ListNode *last = slow; //记录中间点
while (fast->next && fast->next->next) { //利用双指针找链表中间点
last = slow;
slow = slow->next;
fast = fast->next->next;
}
fast = slow->next; //把原链表断开,分为前后两个链表,都不能包含原中间点
last->next = NULL;
TreeNode *cur = new TreeNode(slow->val);
if (head != slow)
cur->left = sortedListToBST(head);
cur->right = sortedListToBST(fast);
return cur;
}
};

最新文章

  1. PHP 下option selected 无效
  2. SQL Server 2008 R2 安装出错:Could not open key
  3. 前端自动化工具 -- grunt 使用简介
  4. GDB代码调试与使用
  5. CentOS 6.4 搭建SVN服务器
  6. 存储过程系列之存储过程sql查询存储过程的使用
  7. java短路问题
  8. Java DB 访问之 mybatis mapper xml 配置方式
  9. 手把手教你撸一个 Webpack Loader
  10. JavaScript 面向对象之原型对象
  11. 学习笔记CB013: TensorFlow、TensorBoard、seq2seq
  12. Balanced Sequence HDU - 6299(杭电多校1 B)
  13. 解决binwalk运行提示缺少LZMA模块
  14. iOS自定义结构体
  15. linux下socket编程常用头文件
  16. 【转】struts2.5框架使用通配符指定方法(常见错误)
  17. 编程笔记:JavaScript 中的类型检查
  18. idea破解方法
  19. TreeSet中自定义Comparator实现降序
  20. php获取微信token和ticket并返回签名

热门文章

  1. 数据库查询优化-20条必备sql优化技巧
  2. CSS绘制正五角星原理(数学模型)
  3. NOI Online #2 提高组 游戏
  4. Springboot mini - Solon详解(二)- Solon的核心
  5. tomcat-1-介绍篇
  6. 最简单的 K8S 部署文件编写姿势,没有之一!
  7. github拉去代码慢的处理方式(最简单)
  8. js v-if 判断多个属性 in
  9. Idea+Git+GitHub图文教程,一篇教程帮你搞定
  10. 恕我直言,你可能连 GitHub 搜索都不会用 - 如何精准搜索的神仙技巧