Leetcode: Convert sorted list to binary search tree (No. 109)
Sept. 22, 2015
学一道算法题, 经常回顾一下. 第二次重温, 决定增加一些图片, 帮助自己记忆. 在网上找他人的资料, 不如自己动手. 把从底向上树的算法搞通俗一些.
先做一个例子:
9/22/2015
Go over one example to build some muscle memory about this bottom up, O(1) solution to find the root node in subtree function.
Sorted List:
1->2->3->4->5->6->7,
How to convert the above sorted list to a binary search tree?
Here is the whole story for working on this alogrithm problem:
109 Convert sorted list to binary search tree (No. 109)
8/25/2015
Read the following blogs:
C#, bottom up, time O(n), space O(log n) solution - best solution:
C#, top down, time O(n^2), space O(long n) solution - naive solution:
worked on code 2 times, first time, the calculation is kind of messy, then, worked on Leetcode question 108, get the idea to make it more simple;
tips like len/2 only shows once, afterwards, use m instead. Just need to improve coding, think to make it more abstract, simple.
9/21/2015
Review the best solution, and then, totally forgot the bottom up solution idea. So, update the code with more comment.
Need to review more about bottom up/ top down solution in tree problems. Get more experience on bottom-up solution, read some articles about it.
9/22/2015
Go over one example to build some muscle memory about this bottom up, O(1) solution to find the root node in subtree function.
Sorted List:
1->2->3->4->5->6->7,
How to convert the above sorted list to a binary search tree?
Thought process:
1. First, get length of the list, which is 7 in the above list;
2. Secondly, define a recursive function called
constructBST(ref TreeNode head, int start, int end)
the above function definition, 3 arguments:
1. First one is the reference of head node of sorted list,
2. Start index of the list,
3. End index of the list
In the function, first define the base case:
head is null, or start<end, return null
start==end, return head
then, call the recursive function for left subtree:
head node is the same, start is the same, but end is len/2-1;
great tip comes in, the head node should move in the function, so that
root node can be accessed in the list using O(1), instead of starting from very beginning.
One more statement:
head = head.next;
TreeNode root = head; // return this node as tree root node
Root.left = left subtree root node
Root.right = right subtree recursive function
constructBST(ref head.next, mid+1, end)
The tips to remember in the design, the recursive function should return the root node of the tree; secondly, input argument of linked list should
use reference, and also head node moves in the recursive function, so it is O(1) to find the root node.
Just cannot believe that only call .next function once in the recursive function! How to argue that the move is only once? Therefore, the total calls
of .next should be length of list. Total recursive function calls is n, length of list.
Debate why the recursive function has to return root node, and set up root node, connect its left/ right subtree root node.
Debate why the linked list head node is moving.
设计这个递归函数, 如何避免从链的头开始访问, 到中间点? 最关键是让链的头移动, 当需要设计树的根节点, 只要移动一步, 就是根节点.
画一个图, 帮助自己理解记忆; 看一篇文章, 开拓思路.
The main point to understand the best solution using O(ln N) space, the left subtree has to be built first, and then,
head node can be retrieved as .next method call, root node can be set up, and then, left subtree can be built. So,
left subtree, then right subtree, then the tree with root node. Bottom up.
Whereas sorted array to BST, the root node can be find right away, and then, tree can be set up top down. Julia is
still confusing this top down / bottom up difference. :-) read more blogs.
Blogs:
1. use global variable to remember the head node of linked list, great idea:
http://www.jiuzhang.com/solutions/convert-sorted-list-to-binary-search-tree/
2. another implementation using two pointers. Try it using C# later.
3. Java implementation, teach me how to use reference in Java or wrapper class. Good point!
http://rleetcode.blogspot.ca/2014/02/convert-sorted-list-to-binary-search.html
4. Time and space complexity analysis - think about it - very clear analysis
5. Three implementation discussions
http://www.cnblogs.com/feiling/p/3267917.html
6. Great explanation - bottom up / top down, and in order traversal/ post order traversal
https://leetcodenotes.wordpress.com/2013/11/23/convert-sorted-list-to-binary-search-tree/
Implement the above 6 blogs using C#, and then, share the blog. After 1 month, check again and see if I can come out the bottom
up solution in 5 minutes. If yes, stop; otherwise review again.
Leetcode: Convert sorted list to binary search tree (No. 109)的更多相关文章
- LeetCode:Convert Sorted Array to Binary Search Tree,Convert Sorted List to Binary Search Tree
LeetCode:Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in asce ...
- [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] Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 这道 ...
- 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: Convert Sorted List to Binary Search Tree 解题报告
Convert Sorted List to Binary Search Tree Given a singly linked list where elements are sorted in as ...
- LeetCode: Convert Sorted Array to Binary Search Tree 解题报告
Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...
- leetcode 108. Convert Sorted Array to Binary Search Tree 、109. Convert Sorted List to Binary Search Tree
108. Convert Sorted Array to Binary Search Tree 这个题使用二分查找,主要要注意边界条件. 如果left > right,就返回NULL.每次更新的 ...
- 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] Convert Sorted List to Binary Search Tree DFS,深度搜索
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
随机推荐
- Web中的XHRHttpRequest
1.提出者:Jesse James Garrett 2.IE中,XHR是通过ActiveX对象实现的.涉及浏览器的兼容性写法. 3.使用 <1>open("请求方式&qu ...
- MVC5 网站开发之五 展示层架构
展示层由Ninesky.Web项目实现,负责网站内容的显示,项目包含Member和Control两个区域. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项 ...
- Android数据加密之Rsa加密
前言: 最近无意中和同事交流数据安全传输的问题,想起自己曾经使用过的Rsa非对称加密算法,闲下来总结一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 ...
- 关于join时显示no join predicate的那点事
我们偶尔,非常偶尔的情况下会在一个查询计划中看到这样的警告: 大红叉,好吓人啊! 把鼠标放上去一看显示这样的信息 No join predicate 直译过来就是:没有连接谓词 在真实的生产环境下我们 ...
- C#组件系列———又一款日志组件:Elmah的学习和分享
前言:好久没动笔了,都有点生疏,12月都要接近尾声,可是这月连一篇的产出都没有,不能坏了“规矩”,今天还是来写一篇.最近个把月确实很忙,不过每天早上还是会抽空来园子里逛逛.一如既往,园子里每年这个时候 ...
- 【十大经典数据挖掘算法】AdaBoost
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 集成学习 集成学习(ensem ...
- C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理
前面一篇随笔企业号的一些基础信息,以及介绍如何配置企业号的回调方式实现和企业号服务器进行沟通的桥梁.本篇主要还是继续介绍企业号的开发工作的开展,介绍微信企业号通讯录管理开发功能,介绍其中组织机构里面如 ...
- Asp.Net MVC 从数据库生成代码(包括页面)
项目需要,数据库已经设计完成,需要生成相关的数据访问代码和页面. 参考:http://www.tracefact.net/asp-net/aspnetmvc-model-part1.aspx http ...
- java web学习总结(三十一) -------------------EL表达式
一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...
- 9.1.2 asp.net core 自动生成组合查询
在做系统的时候,经常遇到前台录入一大堆的查询条件,然后点击查询提交后台,在Controller里面生成对应的查询SQL或者表达式,数据库执行再将结果返回客户端. 例如如下页面,输入三个条件,日志类型. ...