📣 独立日限时特惠: VIP通行证立减$68
楼主: dadadaxian
跳转到指定楼层
上一主题 下一主题
收起左侧

狗家电面

🔗
vtiaocao 2018-3-7 08:25:35 | 只看该作者
全局:
允许space么?允许的话那可以用serialize出来然后换一下位置然后deserialize回去

或者能不能用蓄水池取样 就是每次决定「换不换」有一定的几率?
回复

使用道具 举报

🔗
littledog 2018-3-28 07:18:44 | 只看该作者
全局:
感觉就是建一个tree node wrapper node把原节点包进去,然后遍历原树通过wrapper把原来树的结构记录下来,然后第二次遍历wrapper tree就不需要原来的树的信息了,随机取一个当前可用的节点然后重新分配左右子节点。
  1. private class WrapperNode {
  2.         TreeNode node;
  3.         WrapperNode left;
  4.         WrapperNode right;

  5.         public WrapperNode(TreeNode node) {
  6.             this.node = node;
  7.             this.left = null;
  8.             this.right = null;
  9.         }
  10.     }


  11.     public TreeNode shuffleTreeNodes(TreeNode root) {
  12.         List<TreeNode> list = new ArrayList<>();
  13.         WrapperNode wroot = buildWrapperTree(root, list);
  14.         Collections.shuffle(list);
  15.         return shuffleTree(wroot, list.iterator());
  16.     }

  17.     private WrapperNode buildWrapperTree(TreeNode root, List<TreeNode> list) {
  18.         if (root == null) {
  19.             return null;
  20.         }
  21.         WrapperNode wroot = new WrapperNode(root);
  22.         list.add(root);
  23.         WrapperNode left = buildWrapperTree(root.left, list);
  24.         WrapperNode right = buildWrapperTree(root.right, list);
  25.         wroot.left = left;
  26.         wroot.right = right;
  27.         return wroot;
  28.     }

  29.     private TreeNode shuffleTree(WrapperNode wroot, Iterator<TreeNode> it) {
  30.         if (wroot == null) {
  31.             return null;
  32.         }
  33.         TreeNode left = shuffleTree(wroot.left, it);
  34.         TreeNode right = shuffleTree(wroot.right, it);
  35.         TreeNode root = it.next();
  36.         root.left = left;
  37.         root.right = right;
  38.         return root;
  39.     }
复制代码
回复

使用道具 举报

🔗
qlwfby 2018-3-30 00:31:24 | 只看该作者
全局:
traverse, hash and shuffle
inorder traverse
hash inorder indexes to nodes
fisher-yates shuffle
回复

使用道具 举报

🔗
yangdaxian 2018-6-5 02:41:47 | 只看该作者
全局:
littledog 发表于 2018-3-28 07:18
感觉就是建一个tree node wrapper node把原节点包进去,然后遍历原树通过wrapper把原来树的结构记录下来, ...

请问下po主,你是否没有考虑到“每个node跟以前的该位置node不一样”这个条件?我试着run了一下你的代码,似乎有时会出现一个node位置没变的情况。你觉得如果要完成这个要求的话,还能用recursive的方法么?
回复

使用道具 举报

🔗
yangdaxian 2018-6-5 02:46:13 | 只看该作者
全局:
littledog 发表于 2018-3-28 07:18
感觉就是建一个tree node wrapper node把原节点包进去,然后遍历原树通过wrapper把原来树的结构记录下来, ...

啊我想清楚了,应该是可以的。打扰了
回复

使用道具 举报

🔗
bunnyhuhu 2018-6-5 11:56:57 | 只看该作者
全局:
yangdaxian 发表于 2018-6-5 02:46
啊我想清楚了,应该是可以的。打扰了

hello, 我也有相同的疑惑。。假如level order是A,B,C,#, #, #,D这样的结构,用这个方法做出来的我觉得是D,A,C,#,#,#,B,这样的话C这个位置就没有变啊。。
回复

使用道具 举报

🔗
yangdaxian 2018-6-5 23:17:05 | 只看该作者
全局:
bunnyhuhu 发表于 2018-6-5 11:56
hello, 我也有相同的疑惑。。假如level order是A,B,C,#, #, #,D这样的结构,用这个方法做出来的我觉得是D ...

他的code里有一个shuffle,但是不能保证让每个点都变化位置。但要解决也比较简单,就多shuffle几次直到满足要求就可以了。另外就是40行应该放在38行,38和39放在39,40行,这样保证两次遍历的顺序是一样的,就可以满足题目要求。
回复

使用道具 举报

🔗
lymabcd 2018-8-17 00:21:46 | 只看该作者
全局:
额  我有两个很思路,此题真的有点难度:
解法1, deserialize  树   然后更换相应节点  再 serialize 树  但是这个解法应该不是面试官想要的 因为效率太低了
解法2,找到两个点各自的parent node, 然后做交换 。。。
回复

使用道具 举报

🔗
Zjb1226 2018-9-5 00:51:31 | 只看该作者
全局:
能否这样:
1. 先inorder遍历树一遍把节点存在list里一共n个节点
2. 再inorder遍历把数的结构复制下来,复制树的每个节点的值对应遍历的顺序0...n
3. 把list里的点shuffle
4. 再遍历复制树,根据复制树的值(对应list里的index值)把list里的点重新连一遍
5. 返回list.get(0)
回复

使用道具 举报

🔗
古流月 2018-9-6 10:40:28 | 只看该作者
本楼:
全局:
多谢分享
回复

使用道具 举报

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

本版积分规则

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