在恒定时间内从二叉树中获取数据

时间:2013-10-22 04:11:09

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

预购:enter image description here

订购后:enter image description here

按顺序:enter image description here

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

编辑:

例如,要确定w是否在u的子树中,您应该需要u的预订编号,u的订购后编号,w的预订编号以及后期编号。订单号w。

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

1 个答案:

答案 0 :(得分:3)

酷谜!我希望它不是一个任务,因为我要破坏它。

`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)==8post_order(u.left)未定义,pre_order(u.left)in_order(u.right)等等,因为它没有子项。

考虑节点upre_order(u)==post_order(u)==in_order(u)==3,然后post_order(u.left)==1pre_order(u.right)==5