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

讨论一到Indeed 面经高频题 Tree to array

全局:

2016(1-3月) 码农类General 博士 全职@indeed - 网上海投 - Onsite  | | Other | 应届毕业生

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
马上要去onsite了,看了一道Indeed 的高频面经:
Store a binary tree to array, 怎么存节省空间?

我的理解是如果只寸binary tree的话,一个TreeNode 要存一个value, 已经两个pointer to l
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies

不知道还有没有其他更好的方法?
另外我把用 heap 表示 binary tree的答案写出来。不知道对不对?
  1. import java.util.*;

  2. public class Solution {
  3.     private Queue<TreeNode> nodeQueue = new LinkedList<>();
  4.     private Queue<Integer> indexQueue = new LinkedList<>();
  5.     public Integer[] compressTree(TreeNode root) {
  6.         // step 1: get the height of the tree
  7.         int height = getTreeHeight(root);
  8.         int n = (int) Math.pow(2, height);
  9.         Integer[] array = new Integer[n];
  10.         
  11.         nodeQueue.offer(root);
  12.         indexQueue.offer(1);
  13.         
  14.         while (!nodeQueue.isEmpty()) {
  15.             TreeNode node = nodeQueue.poll();
  16.             int index = indexQueue.poll();
  17.             
  18.             array[index] = node.val;
  19.             
  20.             if (node.left != null) {
  21.                 nodeQueue.offer(node.left);
  22.                 indexQueue.offer(2 * index);
  23.             }
  24.             
  25.             if (node.right != null) {
  26.                 nodeQueue.offer(node.right);
  27.                 indexQueue.offer(2 * index + 1);
  28.             }
  29.         }
  30.         
  31.         return array;
  32.     }
  33.    
  34.     private int getTreeHeight(TreeNode root) {
  35.         if (root == null) {
  36.             return 0;
  37.         }
  38.         
  39.         int left = getTreeHeight(root.left);
  40.         int right = getTreeHeight(root.right);
  41.         
  42.         return Math.max(left, right) + 1;
  43.     }
  44.    
  45.     public static void main(String[] args) throws InterruptedException {
  46.         Solution sol = new Solution();
  47.         
  48.         TreeNode root = new TreeNode(2);
  49.         root.left = new TreeNode(4);
  50.         root.right = new TreeNode(5);
  51.         root.left.left = new TreeNode(6);
  52.         root.right.left = new TreeNode(1);
  53.         root.right.right = new TreeNode(7);
  54.         root.left.left.left = new TreeNode(8);
  55.         root.right.right.right = new TreeNode(9);
  56.         
  57.         Integer[] result = sol.compressTree(root);
  58.         
  59.         for (Integer e : result) {
  60.             System.out.print(e + " ");
  61.         }
  62.         
  63.         System.out.println("");
  64.     }
  65.    
  66.    
  67.     static class TreeNode {
  68.         int val;
  69.         TreeNode left, right;
  70.         
  71.         public TreeNode (int val) {
  72.             this.val = val;
  73.         }
  74.     }
  75. }
复制代码

评分

参与人数 3大米 +9 收起 理由
linbianxiaocao + 1 给你点个赞!
富民文 + 3 感谢分享!
frk + 5 谢谢你的介绍!

查看全部评分


上一篇:2月初Snapchat电面
下一篇:Indeed 電面 2/15
推荐
xiaofeng 2016-12-31 02:58:26 | 只看该作者
全局:
lfzh123 发表于 2016-12-12 14:13
如果是比较稀疏的BT,可以存一下pre/post order+inorder.我觉得这样不错,因为只存了non-null的结点,size只 ...

用 preorder + inorder 存有一个很大的问题。 就是 duplicates不好处理。
请看 https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
重建binary tree的时候是assume no duplicates的。

我觉得如果是sparse BT, 直接serialize BT + "#" for null node 就完了。
或者两个arrays的办法也很好。
回复

使用道具 举报

推荐
daniel123 2016-7-29 08:51:51 | 只看该作者
全局:
也可以用两个array,preorder存一个,inorder存一个, 回复起来也比较方便
回复

使用道具 举报

推荐
AndrewFish 2016-12-19 09:05:26 | 只看该作者
全局:
格格笑 发表于 2016-11-18 10:29
heap  底层结构是数组  他在数组里的实现是左儿子 是2*i 右儿子是2*i + 1  希望你懂了~  如果不懂请看这 ...

但是这种解法要求这个二叉树是每一层都是满的而且最后一层元素都在最左侧。 实际Indeed问这个问题的时候, 他们的binary tree满足这个性质吗?
回复

使用道具 举报

🔗
Zek_W 2016-9-9 12:22:26 | 只看该作者
全局:
“Array 转化成 dense format,也就是说用两个array, 一个存值,一个存 值对应的index. ”

请问index是值在heap结构中的index吗?
回复

使用道具 举报

🔗
forestwn 2016-10-25 14:42:48 | 只看该作者
全局:
请问  “用heap的方法”是什么意思?lz的code里并没有看到heap呀?
回复

使用道具 举报

🔗
文体两开花 2016-11-19 01:29:19 | 只看该作者
全局:
forestwn 发表于 2016-10-25 14:42
请问  “用heap的方法”是什么意思?lz的code里并没有看到heap呀?

heap  底层结构是数组  他在数组里的实现是左儿子 是2*i 右儿子是2*i + 1  希望你懂了~  如果不懂请看这个链接~
http://www.cse.hut.fi/en/researc ... ial/taulukkona.html

评分

参与人数 1大米 +10 收起 理由
忆梦前尘 + 10 感谢分享!

查看全部评分

回复

使用道具 举报

🔗
forestwn 2016-11-19 06:33:21 | 只看该作者
全局:
格格笑 发表于 2016-11-19 01:29
heap  底层结构是数组  他在数组里的实现是左儿子 是2*i 右儿子是2*i + 1  希望你懂了~  如果不懂请看这 ...

懂了 感谢!
回复

使用道具 举报

🔗
lfzh123 2016-12-12 14:13:06 | 只看该作者
全局:
如果是比较稀疏的BT,可以存一下pre/post order+inorder.我觉得这样不错,因为只存了non-null的结点,size只是所有non-null节点的两倍而已。
回复

使用道具 举报

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

本版积分规则

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