【问题标题】:Finding common parent in perfect binary tree在完美二叉树中找到共同父节点
【发布时间】:2020-02-14 22:49:16
【问题描述】:

这个问题:

Are there any efficient ways to populate a balanced tree structure

提供了一种标记任意深度的完美二叉树的分析方法。

在这样的树中,有没有办法有效地找出任意叶节点子集的第一个公共父节点?

例如,给定以下二叉树:

我正在寻找一种方法,如果:

输入为:3,5 输出为:0

输入为:3,5,6 输出为:0

输入为:3,4 输出为:1

我能想到的唯一方法是从每个给定的叶节点遍历到根 (0),然后选择第一个公共叶节点。

是否有任何封闭形式的分析方法可以找到第一个共同的父母?

【问题讨论】:

  • 似乎“平衡二叉树”实际上是指“完美二叉树”。见difference。你能澄清一下吗?
  • @trincot 是的,它是一棵完美的二叉树,每个非叶节点恰好有两个孩子,每个孩子只有一个父节点,所有叶节点的深度相同。

标签: algorithm binary-tree


【解决方案1】:

H 成为您树的高度,让k 成为您输入中的数字计数。

如果从 1 开始计算节点并写入节点的二进制数,则很明显每个节点的数字都是其所有子节点的数字的前缀。所以,要找到最小的共同祖先,你应该找到二进制数的最大公共前缀(GCP)。

minmax 成为您子集中的最小和最大数字。如果您输入的数字已经排序,您可以在O(1) 中找到minmax。如果没有排序,可以在O(k * H)中找到minmax

所有二进制数的 GCP 是 minmax 的 GCP - 你可以在 O(H) 中找到它。

如果数字已排序,则此算法在 O(H) 中有效,否则在 O(k * H) 中有效(尽管如果您实施正确,您的算法也适用于 O(k * H))。

【讨论】:

  • 不错的 +1。因此,它是所有K 值中二进制表示中最长的公共前缀。另外,如果我的算法正确,如果数据没有排序,我认为我们可以将所有值放入 map 并从中获取实际的父级。我们不需要这样排序。如果存在重复值,我们将节点引用本身放在地图中,这将始终是唯一的。
  • [10,11,101] 的 GCP 不是 [10,101] 的 GCP。你需要在词法上找到最小值和最大值,而不是数字
  • 一个很好的快速方法:找到最小的数字。那是分钟。将所有其他数字向右移动,直到它们
  • @Tryer 表示子集仅包含叶节点,因此所有数字的二进制位数相同,因此在这种情况下,数字最小 == 词法最小。但对于一般情况,当然,它应该是词法最小的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 2012-10-28
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
相关资源
最近更新 更多