转一些我blog上一些常见的二叉树面试问题和总结

转自:http://www.mitbbs.com/article_t/CS/31186033.html

 

二叉树是面试里常见的问题种类,大家在面试前必须熟悉这一类的问题。以下是我收集的一些常见二叉树面试问题(包括我亲身经历的)。多做多练习,相信你一定可以掌握好。我会在这里更新和添加常见到的二叉树问题。

Determine if a Binary Tree is a Binary Search Tree
这题很常见,microsoft,amazon, google的面试都有人被问过。这题也是二叉树的好题
,必须得对BST的定义搞清楚。有一个常见的陷阱,就是把current node的value和left
node, right node比较;这是不正确的解法。也有一个很容易想到的brute force解法
,但是每个node会被遍历很多次。正确的优解是 (O(N)解,N=number of nodes)有两
种,面试者必须对这题熟悉。

Binary Search Tree In-Order Traversal Iterative Solution
这题应该是 google 电面经常问的问题吧。我那时候就是google电面没答好这问题,所
以就fail了,超级后悔啊。强烈推荐的问题。In-Order traversal能很轻松地用递归来
实现(就是常见的DFS),但非递归怎么解呢?总结就是,DFS的特性是用stack。常见
的DFS题都是用递归,哪来的stack啊?其实递归就是把function push 上memory stack
,一旦function结束了就从memory stack pop出来。所以DFS可以转换成非递归的解法
,就是利用stack的辅助。基本上有两种解法,比较容易的是在每个节点上加一个visited field。那如果是第二次遍历这个节点那就打印出来。更好的解法是不用visited field的。如果觉得这题对你来说太难的话,先尝试 pre-order traversal吧。另一方面如果这题对你不够挑战性,那请你尝试 post-order traversal,比起 in-order 难多了。

Printing a Binary Tree in Level Order
好像 facebook 满喜欢问这问题。这题是很基础的用breadth-first search(BFS),面
试者必须熟悉。这题也能用DFS来解,而且时间复杂度也是O(N)。BFS的特性是使用
queue,而DFS的特性是用stack。

Printing a Binary Tree in Zig-Zag Level Order
这题是上题的一个变种,就是从上到下,然后反复从左到右,右到左的打印树。这次我
们不用queue了。用另一种data structure来储存,就可以很容易地办到。

Populating Next Right Pointers in Each Node
这题就是把所有node的next right指针指向右边邻居(right sibling)(一开始全被初始化为null)。如果没有邻居,应该指向null。你可以假设二叉树是满的。这题的诀窍在于利用DFS的思路,再加上善用之前节点已经连接好的巧妙之处,就能轻松解决。
很不错的二叉树问题。

Finding the Maximum Height of a Binary Tree
这题就是寻找二叉树的最深度,利用DFS可以轻松解决。挑战的是:如何写非递归的版本。有两种解法,一是用BFS,解法比较直接。另一种解法是转换成非递归BFS,方法请参考In-Order Traversal Iterative Solution.

Serialization/Deserialization of Binary Tree
"Serialization"的定义为把二叉树储存于文档里,而"Deserialization"的定义为把二叉树从文档里读取,恢复之前的状态。答案就是利用pre-order可以办得到,关键在于你必须掌握pre-order,post-order,和in-order之间的特性。还有需要理解为什么二叉树要储存NULL node,而重建BST就不需要(看下题)。

Rebuild Binary Search Tree from Pre-order Traversal
输入是从BST用pre-order traversal打印出来的data,请问怎么重建BST? 总结就是:当我们遇到一个即将被植入的节点,第一个能被植入的空间而且也符合BST的要求,就是正确的地方。每次植入的时候都检测是不是BST就应用了之前“Determine if a Binary Tree is a Binary Search Tree”一模一样的思路。检测只需要O(1),那么重建树就只需要O(N).

Print Edge Nodes (Boundary) of a Binary Tree
这题好像是微软面试题,满好玩的。问题是要把树的周围 counter-clockwise 打印出来。先打印root,然后从上到下打印最左边的节点,然后从左到右的顺序打印叶子节点,然后从下到上打印最右边的节点。这题的精粹就在于使用depth-first traversal,一个递归就能搞定。先把树分为两个树(root的左孩子和右孩子)处理。先处理左树,再处理右树。如果卡在怎么从下到上打印最右边节点,可以想想post-order traversal。

Binary Tree Post-Order Traversal Iterative Solution
这题比起 In-Order Traversal 难多了。是很罕见的面试题,好像只有 amazon 问过这道题。用 visited flags 好做很多,但是不用 visited flags 还是有可能解出来的。思路就是利用一个变量储存之前访问的节点。然后在每次循环的时候比较之前节点和 stack 上的节点,这样就可以知道我们在往上还是往下走。如果往上走的话,就能得知是从左节点还是右节点上来的,这有大大的帮助。另外一个方法是使用两个 stack,解法很简洁,很巧妙,但是空间复杂度没有一个 stack 的解法少。

posted @ 2012-10-12 13:54  技术收集专用  阅读(717)  评论(0编辑  收藏  举报