Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

这题和sort list等题都比较相似,需要先用快慢指针的方法找到链表的中点,然后用recursive的方式构建左子树和右子树(用到的思想是Divide&Conquer),然后再构建好这个节点。

编程时一点要注意:

(1)dummy节点的使用可以帮助找到中点的prev节点

但是dummy节点只有当用时再构造,建议不要提前建好当参数传进来,会非常不清晰。用完后最后记得delete,否则会memory leak. 也不能delete得过早,因为prev可能等于dummy.

(2)边界情况

当middle节点为head时,应注意,左子树为NULL,不要递归build。

Code:

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *sortedListToBST(ListNode *head) {
if(!head) return NULL;
TreeNode* treeHead = buildTree(head);
return treeHead;
} TreeNode* buildTree(ListNode *head)
{
if(!head) return NULL;
if(!head->next) return new TreeNode(head->val); ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* prev = dummy, *slow = dummy->next, *fast = dummy->next->next;
while(fast && fast->next)
{
slow = slow->next;
prev = prev->next;
fast = fast->next->next;
} TreeNode* cur = new TreeNode(slow->val); TreeNode* left, *right; // second error, cannot initialize left in the if-else
right = buildTree(slow->next);
if(prev != dummy) // first error
{
prev->next = NULL;
left = buildTree(head);
}
else left = NULL; cur->left = left;
cur->right = right; delete dummy; // first error, can not delete dummy too early if prev equals dummy return cur;
}
};

  

最新文章

  1. C#委托与事件的简单使用
  2. jsp与php混用的漏洞
  3. Redis学习笔记(6)-SortedSet
  4. lnmp脚本
  5. 在jsp页面上直接打开PDF文件
  6. VritualBox 中Debian安装tool
  7. KnockOutJS学习系列----(一)
  8. MySQL在Windows和Linux减少数据库
  9. P3373 【模板】线段树 2
  10. 使用Python批量下载Plus上的Podcast
  11. [HEOI2015]定价 (贪心)
  12. Unity3d之截图方法
  13. GitHub客户端使用
  14. Linux运维工程师需要掌握什么才能胜任工作呢
  15. Spring Boot 验证表单
  16. HTML基础语法
  17. ElasticSearch 2 (8) - 概览与简介
  18. Python中字典的基本操作
  19. CATransform3D的m34使用
  20. epel [Errno 14] problem making ssl connection

热门文章

  1. [Java] JSP笔记 - Filter 过滤器
  2. AVL树
  3. 比特币_Bitcoin 简介
  4. Spring的简单demo
  5. web app开发技巧总结 (share)
  6. Sublime Text 3 Plugin Better!
  7. 在利用xampp开发时候为apache设置多个项目目录
  8. MySQL收藏
  9. Session、Cookie--2017年1月3日
  10. 引用类型的转换问题和instanceof