CCI 复习笔记 4

来源:互联网 发布:淘宝首页前端代码 编辑:程序博客网 时间:2024/06/14 06:03

本来今天把第四章复习完绰绰有余,不幸的是被一道多年前一直没有懂的DP题迷住了,花了半个晚上做那个题。。现在外面零下好几度,肚子好饿

题外话不讲了,今天要做的是tree and graph,明天面youtube我是抱着必须要死的决心了,明天还要找点时间复习bit manipulation


其实感觉上还是tree,graph考得多,微软招聘会上的初试就是balance tree from sorted array, amazon电面是BFS


4.1 检查一个tree是不是balance


这道题每次看到基本上都是想着怎么写一个算法可以得到一个tree的高度先,自然是得到高度了就可以开始用递归算了,但是一个重要的trick就是得到高度以后,如果已知一个subtree已经不balance了,就返回一个-1,这样保证了不用多余的function,检测树的高度的代码很简单, checkdepth(node)=max(checkdepth(node.left),checkdepth(node.right))+1, base case 是 if(node is None): return 0


4.2 检查图中是否两个node是连接的


BFS,另外就是如果要report这个path的话,似乎最好的方法是保存一个parent的信息在queue里面,但是queue之后是要pop的,所以我的办法是不pop,直接用一个top指示已经到哪了。内存使用要大一些,但是免去了很多麻烦。之后就traceback这个信息就好了


另外一个相关的问题是如果要给出path的值呢,这个似乎更加好办,你需要做的就是使用正常的queue,但是在enqueue的时候存入level的信息,level的信息是一句parent递增的,这个很类似于如何print一个树的问题,我的解决办法就是就是在DFS中,每次都增加存入一个level,在pop之后就print,node自身有一个print的function


4.3 在一个sorted的sequence基础上,做一个balance tree


想当简单,就是用median建一个node,然后两边继续建tree


4.4 建一个linked list,让同一个level的node在一个 linked node上


任何一种traversal都可以实现对level的编码,可以使用一个简单的BFS来做,一个重要的认识是,BFS用来visit所有tree node需要花多少时间呢?O(N),因为仅仅是touch所有的node,在graph中,DFS 和 BFS都是O(E+V),树中E和V是什么关系呢?在一棵完全树里, N=2^level-1,最后一层等于2^(level-1),所以剩下,2^(level-1)-1,这个乘2,2^level-2

所以,V=E-1。。。。。尼玛,这么神奇的


4.5 检查一个树是不是BST


这题貌似google初始考到了,我决定写一下。想法似乎很简单,无非是做一个 in_order的检查,书上说了一个比较重要的东西,就是用array的额外储存来检测的话,会无法处理重复值,因为按照定义,重复值应该放左边(或者至少应该放一边。。。). 写法并不复杂,对于一个node,成立的定义就是左边和右边都对,以及自己相对left和right也是对的。


4.6 找到in_order的下一个值

  

这个题,找到left_most child和right most ancestor, 一个比较tricky的问题是,left_most child必然是小于right most ancestor的,事实上,一个node属于parent的left tree,那么无论如何这个node都是小于这个parent的


4.7 找到两个node的共同祖先


比较简单的办法就是做traversal之后做一个parent的链接罗,然后traceback,但是本题要求不可以使用特么额外数据。书上的算法没看懂,大概的意思是不断检测p,q是不是在一棵树里。需要recursion来检测吧我估计,不过似乎是O(nlogn)


4.8 检查一个tree是不是另外一个tree的subtree


貌似用的是backtracking,就是用recursion检测match的问题。


4.9 找到一个tree中所有path加起来等于某个值


recursion,每次到达一个node都向上追溯检测。对于path是pass by value吧,这样可以解决左边树弄完之后右边树的信息的问题,但是也可以使用pass by value,然后把之前的数据在撤回的时候都处理掉。这个似乎每次都需要多加思考一下,


check(left)

check(right)

path.pop() or path[i]=INT.MIN

0 0
原创粉丝点击