楼主: efny
跳转到指定楼层
上一主题 下一主题
收起左侧

FB家电面面经

🔗
averillzheng 2014-11-26 23:52:46 | 只看该作者
全局:
morris in-order traversal
回复

使用道具 举报

🔗
neusharon 2014-11-30 03:24:00 | 只看该作者
全局:
稍微想了一下,感觉题目对两个BST的intersection不清楚,如果intersection是指子树(包括结构上)完全相同的话,前面层住说的先flatten为linkedlist然后找list的intersection的方法是不对的。eg:
   2                 2
     \                 \
      5                 4
   /   \                  \
4      6                 5
                             \
                              6
我认为constant space的方法是morris traversal 找到相同的node,再对比两个node的子树相同。求拍
回复

使用道具 举报

🔗
dtcxzch 2014-12-6 13:01:12 | 只看该作者
全局:
有parent的话用中序遍历从两个tree的最小节点开始比,然后依次找下个节点就可以了吧
回复

使用道具 举报

🔗
csstudyup234 2015-1-31 09:58:02 | 只看该作者
全局:
这题要求不能用递归?
回复

使用道具 举报

🔗
NdrZmansN 2015-1-31 14:08:08 | 只看该作者
全局:
感觉是写BST的inorder iterator.
这样就变成intersection of two sequences了.
回复

使用道具 举报

🔗
CrossTheWall 2015-1-31 14:31:06 | 只看该作者
全局:
efny 发表于 2014-5-10 05:16
挂了,应该是个华裔哥。我一开始说了2种有extra space的方法,他不让我写,问我有没有不需要extra space的 ...

这个面试官简直脑残啊。。。。应该告诉他“you need some education..”
回复

使用道具 举报

🔗
CrossTheWall 2015-1-31 14:34:03 | 只看该作者
全局:
sj1456 发表于 2014-5-19 11:31
stack不是extra space???。。。另外O(1)space是不是就是没用extra space?

O(1)是常量空间啊,和in-place不一样的
回复

使用道具 举报

🔗
CrossTheWall 2015-1-31 15:40:00 | 只看该作者
全局:
neusharon 发表于 2014-11-30 03:24
稍微想了一下,感觉题目对两个BST的intersection不清楚,如果intersection是指子树(包括结构上)完全相同 ...

是的,flatten成list的方法需要考虑还原成之前的树, 因为按理说应该不允许毁坏之前的数据结构,除非是有明确要求可以改变这棵树。而且保存遍历结果的list需要extra space的,不合题意啊。

如果是比较子树结构相等,为何要是BST呢,一般的Binary Tree就行啊。总觉得这个面试官自己都不清楚
回复

使用道具 举报

🔗
pandafolk 2015-3-19 19:41:04 | 只看该作者
全局:
楼上有人说对了,就是iterator的变型嘛。。虽然面试官可能表述不清楚。但是不用递归是肯定的,也不能把全部节点都保存出来,这样耗费O(n)的复杂度。
1、因为是BST,所以迅速想到中序遍历是有序的,所以可以从两个树分别各自最左边开始比较。那么就是implement 一个 BST的iterator。
2、鉴于面试官说可以用栈,那么这个题目的额外空间复杂度应该是O(h)是树的高度。

3、如果不想用栈,可以利用parent节点,实现和栈一样的功能。

4、楼主已经说了,是找到同时出现的数啊,所以不是指结构上的交叉。

所以本题考察:中序遍历的非递归实现 + find intersection of two array 如果基础扎实10min应该可以码完。
同样出现的facebook面试为:here 以及 there
以下贴出代码:(用stack,O(h)额外空间)
  1. public class BSTIterator {
  2.     private Stack<TreeNode> stack = new Stack<TreeNode>();
  3.    
  4.     public BSTIterator(TreeNode root) {
  5.         pushAllLeft(root);  
  6.     }

  7.     /** @return whether we have a next smallest number */
  8.     public boolean hasNext() {
  9.         return !stack.empty();
  10.     }

  11.     /** @return the next smallest number */
  12.     public int next() {
  13.         TreeNode node = stack.pop();
  14.         pushAllLeft(node.right);
  15.         
  16.         return node.val;
  17.     }
  18.    
  19.     public int min() {
  20.         if (!stack.empty()) {
  21.             return stack.peek();
  22.         }
  23.     }
  24.    
  25.     private void pushAllLeft(TreeNode root) {
  26.         TreeNode head = root;
  27.         while (head != null) {
  28.             stack.push(head);
  29.             head = head.left;
  30.         }
  31.     }
  32. }

  33. public class Solution {
  34.     public ArrayList<TreeNode> findIntersectionInTwoBST
  35.       (TreeNode rootA, TreeNode rootB) {
  36.         if (rootA == null || rootB == null) {
  37.             return null;
  38.         }
  39.         BSTIterator ia = new BSTIterator(rootA);
  40.         BSTIterator ib = new BSTIterator(rootB);
  41.         ArrayList<TreeNode> ans = new ArrayList<TreeNode>();
  42.         while (ia.hasNext() && ib.hasNext()) {
  43.             if (ia.min().val == ib.min().val) {
  44.                 ans.add(ia.next());
  45.             } else if (ia.min().val < ib.min().val) {
  46.                 ia.next();
  47.             } else {
  48.                 ib.next();
  49.             }
  50.         }
  51.         
  52.         return ans;
  53.     }
  54. }
复制代码

评分

参与人数 3大米 +14 收起 理由
lch04 + 10 感谢分享!
peace + 3 其实这题只是要把两树中重复的元素找出来就.
会编程的猪先生 + 1 回答的很好!

查看全部评分

回复

使用道具 举报

🔗
pandafolk 2015-3-19 19:41:48 | 只看该作者
全局:
CrossTheWall 发表于 2015-1-31 02:40
是的,flatten成list的方法需要考虑还原成之前的树, 因为按理说应该不允许毁坏之前的数据结构,除非是有 ...

不是指结构上的交叉。。我个人感觉是iterator而已 所以上面贴了下代码。、,,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表