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

fb intern面经,面对奇葩问题膝盖碎了

🔗
byrlhb 2014-10-29 01:23:35 | 只看该作者
全局:

楼主还有一个,就是每个节点的左孩子和右孩子一定是比它父亲大一或者小1,感觉其实在判断left和right是不是有这个点对应的index的时候只需要用if就可以了,如果能到达这个index,那么说明所有绝对值小于或等于这个index的点已经经历过了
回复

使用道具 举报

🔗
gsm107 2014-10-29 13:21:27 | 只看该作者
全局:

层主我问下,你是怎么判断节点在一条线上呢,就比如说root.left.right和root.right.left,因为按图上画的,root.left.right就跟root在一条垂直线上了,这时候root.right.left有节点的话,位置不就跟那个root.left.right重合了么?
回复

使用道具 举报

🔗
gsm107 2014-10-29 13:21:40 | 只看该作者
全局:

层主我问下,你是怎么判断节点在一条线上呢,就比如说root.left.right和root.right.left,因为按图上画的,root.left.right就跟root在一条垂直线上了,这时候root.right.left有节点的话,位置不就跟那个root.left.right重合了么?
回复

使用道具 举报

🔗
gsm107 2014-10-29 13:22:02 | 只看该作者
全局:

层主我问下,你是怎么判断节点在一条线上呢,就比如说root.left.right和root.right.left,因为按图上画的,root.left.right就跟root在一条垂直线上了,这时候root.right.left有节点的话,位置不就跟那个root.left.right重合了么?
回复

使用道具 举报

🔗
pyemma 2014-10-30 09:54:52 | 只看该作者
全局:
我在疑惑这道题会不会有交叉的情况,如果有较差那就不知道要怎么做了,没有交叉的话那就很好说,中序遍历一下带着列数然后往hash里面存就好了
回复

使用道具 举报

🔗
valder 2014-10-30 10:13:49 | 只看该作者
全局:
用level-order遍历然后把相应的点加到arraylist里面去吧
回复

使用道具 举报

🔗
22691482 2014-11-4 13:03:48 | 只看该作者
全局:
BFS-》 保证顺序,即越靠近根的在队列前面
然后map<vertical_index, queue<node*>>.
其中,根的vertical_index是0,往左减1,往右加一。
用两个变量记录min_vertical_index, max_vertical_index .
打印时从map里,从min_vertical_index, 到 max_vertical_index
回复

使用道具 举报

🔗
adiggo 2014-11-5 07:30:50 | 只看该作者
全局:
这道貌似是高频题啊。
回复

使用道具 举报

🔗
kongweihan 2014-11-24 08:41:01 | 只看该作者
全局:
22691482 发表于 2014-11-4 13:03
BFS-》 保证顺序,即越靠近根的在队列前面
然后map.
其中,根的vertical_index是0,往左减1,往右加一。
...

请问BFS如何知道当前节点的vertical_index呢?
回复

使用道具 举报

🔗
kongweihan 2014-11-24 08:44:12 | 只看该作者
全局:
我觉得可以用TreeMap,随时保证index按顺序排列,TreeMap<Integer, TreeMap<Integer, Integer>> map;
递归DFS,每次调用传入level以及横向的index,左孩子-1,右孩子+1
  1. TreeMap<Integer, TreeMap<Integer, Integer>> map;

  2.     void verticalPrint(TreeNode root) {
  3.         if (root == null) return;
  4.         map = new TreeMap<Integer, TreeMap<Integer, Integer>>();

  5.         populateMap(root, 1, 0);
  6.         printMap(map);
  7.     }

  8.     void populateMap(TreeNode root, int level, int indent) {
  9.         if (!map.containsKey(indent)) map.put(indent, new TreeMap<Integer, Integer>());
  10.         map.get(indent).put(level, root.val);

  11.         if (root.left != null) {
  12.             populateMap(root.left, level+1, indent-1);
  13.         }
  14.         if (root.right != null) {
  15.             populateMap(root.right, level+1, indent+1);
  16.         }
  17.     }

  18.     void printMap(TreeMap<Integer, TreeMap<Integer, Integer>> map) {
  19.         for (Integer indent : map.keySet()) {
  20.             for (Integer level : map.get(indent).keySet()) {
  21.                 System.out.print(map.get(indent).get(level) + " ");
  22.             }
  23.             System.out.println();
  24.         }
  25.     }
复制代码

补充内容 (2014-11-24 08:46):
时间复杂度O(NloglogN),因为两层TreeMap所以两个log(大家觉得对么?),空间复杂度O(N)

评分

参与人数 1大米 +3 收起 理由
Pharamid + 3 感谢分享!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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