【问题标题】:Obtaining data from binary tree in constant time在恒定时间内从二叉树中获取数据
【发布时间】:2013-10-22 04:11:09
【问题描述】:

预购:

下单:

按顺序:

我有一棵二叉树,其中分配给节点的前序号、后序号和中序号(0 到 11)。如何在每个节点中使用中序号、前序号和后序号来获取以给定节点 u 为根的子树在恒定时间内的大小?

编辑:

例如判断w是否在u的子树中,需要u的前序号、u的后序号、w的前序号、后序号w的订单号。

因为如果 w 的预购数量大于 u 的预购数量,并且 w 的后序号小于 u 的后序号。那么我们可以得出结论 w 在 u 的子树中。

【问题讨论】:

  • 你需要实现b-tree还是需要使用b-tree?如果你需要使用b-tree,一些库支持你。你不需要实现。
  • @MinGw 你的意思是如果输入是 5 那么答案应该是 0,0 和 12 并且在每种情况下都应该花费恒定的时间?

标签: c++ data-structures binary-tree


【解决方案1】:

酷拼图!我希望这不是一个任务,因为我要破坏它了。

`pre_order(u.right) - pre_order(u.left) + post_order(u.right) - post_order(u.left) + 1 == 子树中的节点数。

pre_order(u.right) - pre_order(u.left) 计算左孩子的节点数,因为从左孩子开始到右孩子开始的“距离”就是左孩子的大小。

同样,post_order(u.right) - post_order(u.left) 计算右孩子中的节点数,因为左端和右孩子端之间的差异是右孩子的大小。

加 1 包括树本身的根。显然,如果那一侧没有孩子,则任何一项都可能为零。


上面显示的树中的节点没有名称。我的理解是上图中的数字代表pre_order(x)或post_order(x)或in_order(x)的值,其中x是一个我们不知道名字的节点,但是它在树中的位置对观众来说是显而易见的.

在“现实生活”中,每个节点将包括:(可选名称)、in_order 值、pre_order 值、post_order 值、(可选)左孩子、(可选)右孩子,以及可选的其他信息。

考虑最右下角的节点; post_order(u)==8, post_order(u.left) 是未定义的,pre_order(u.left) 和 in_order(u.right) 等等,因为它没有孩子。

考虑节点u 使得pre_order(u)==post_order(u)==in_order(u)==3,然后是post_order(u.left)==1 和pre_order(u.right)==5。

【讨论】:

  • 首先不是赋值。但我可能会在到期日之后发布我的作业。其次,你提供了一个很好的方法来解决这个问题,但是你的方法并不需要恒定的时间,在这个问题中,你实际上看不到二叉树的形状。您应该只使用每个节点的编号。
  • 这是恒定的时间。它使用来自节点的 4 个(或更少)数字。无需搜索、迭代等。
  • "左端和右端的区别" 这里怎么得到左端和右端的数字呢?您知道的唯一数字是给定节点中的唯一一个,u。
  • 节点 u 知道它的左右孩子,因为它是一棵树。查看子节点是一个常数时间的操作(没有迭代)。
  • 如果你说Node,你知道它的左右孩子,它可以工作。但我不确定这一点,因为只给出了一个节点 u。
猜你喜欢
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多