预购:
订购后:
按顺序:
我有一个二叉树,其中包含分配给节点的预订,后序和有序编号(0到11)。如何在每个节点中使用有序编号,预编号和后序编号来获取以给定节点为根的子树的大小,u在一个恒定的时间内?
编辑:
例如,要确定w是否在u的子树中,您应该需要u的预订编号,u的订购后编号,w的预订编号以及后期编号。订单号w。
因为如果w的预订数量大于u的预订数量,那么 w的后序数小于u的后序数。然后我们可以得出结论 w在你的子树中。
答案 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)==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
。