【问题标题】:Efficient algorithm for finding the in-order rank of a binary tree node查找二叉树节点有序秩的高效算法
【发布时间】:2015-08-20 14:57:09
【问题描述】:

给定一棵二叉树(不一定是二叉搜索树)和该树中的一个节点,找到该节点的有序秩的有效算法是什么(最好在 Java 中)?

O(n) 算法可以通过遍历(递归或迭代)实现。有更好的吗?感谢您的任何建议。

【问题讨论】:

  • 你会在树上做很多这样的查询吗?你能构造你的树,以便存储每个节点的子节点数吗?
  • 你在寻找order statistics tree的变种,基本上。
  • @JerryFederspiel 实际上我曾考虑过这种缓存(即为节点添加子信息)。但是,我最初需要的是一个比O(n)更好的一次性算法(不假设存储任何附加信息)。
  • @amit 顺序统计树是否适用于只是简单二叉树(不是搜索树)的树?
  • 是的,你想要按顺序排列,这就是顺序统计树的算法所做的。碰巧在 BST 中,有序排名也是有序统计,这就是它的实际使用方式。

标签: java algorithm data-structures tree binary-tree


【解决方案1】:

想象最坏的情况:每个节点只有一个左孩子,所以整棵树变成了一个链表。

如果给定一个根,要计算排名,您需要访问叶子,在这种情况下花费 O(n)。因此,O(n) 在最坏的情况下是最好的,无需在节点中存储额外信息。

【讨论】:

  • 感谢您的回答。那讲得通。只是为了咯咯笑,如果允许在节点上存储额外的信息,你会存储什么样的信息,算法会是什么?我猜当你构建树时,在每次插入一个节点时,你用子节点的数量(左孩子和右孩子分别)更新祖先节点(直到根),然后在排名检索算法杠杆作用此信息(包括节点本身在内的所有祖先中的左子节点数的总和)使其成为O(logn) 算法?
  • @AsifIqbal 绝对。您问题下方第二条评论中的维基百科链接解释了如何。
猜你喜欢
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多