我想知道在计算机科学背景下对“祖先”定义的共识是什么。
我只是问,因为在Introduction to Algorithms,第二版,p。 259有一个奇怪的算法Tree-Successor(x)
的描述。在找到节点 x 的后继者时,
[...]如果节点 x 的右子树为空且 x 有后继 y ,那么 y 是 x 的最低祖先,其左子也是 x 的祖先。
在二元搜索树中,其根具有键2
以及子1
和3
,1
的后继者是其父2
。在这种情况下, x 是 x 的后继者的左子, y 。根据这本书的定义, x 必须是它自己的祖先,除非我遗漏了什么。
我在errata中没有找到任何关于此事的内容。
答案 0 :(得分:14)
这仅仅是定义问题,但在这种情况下,是。 CLRS将x的祖先定义为从根到x的唯一路径上的任何节点,根据定义,它包括x。
你引用的句子片段首先提到下一页的练习12.2-6,它指明了这一点:
(回想一下每个节点都是它自己的祖先。)
: - )
答案 1 :(得分:5)
树中的节点是否被视为自己的祖先?
不正常,AFAIK。例如,在binary trees上的维基百科页面中, ancestor 定义为:
如果存在从节点p到节点q的路径,其中节点p比q更接近根节点,则p是q的祖先,q是p的后代。
但显然教科书对祖先的定义是一个节点是它自己的祖先。这个定义并不完全直观,但教科书可以自由地为其使用的术语引入自己的定义。也许这个定义简化了一些相关的描述/定理/等。
答案 2 :(得分:-1)
不,节点不是它自己的祖先。根据我的说法,它应该是:如果节点x的右子树是空的并且x具有后继y,那么y是x的最低祖先,其左子节点是either x or an ancestor of x.
但是书中给出的代码据说是处理这样的案件类型。