12-1(带有相同关键字的二叉搜索树)相同关键字给二叉搜索树的实现带来了问题。
a. 当用TREE-INSERT
将
n
n
n个其中带有相同关键字的数据插入到一棵初始为空的二叉搜索树中时,其渐进性能是多少?
最坏情况下,所有关键字相同,那么将形成一个单链。时间复杂度为 O ( n 2 ) O(n^2) O(n2)。
建议通过在第5行之前测试
z
.
k
e
y
=
x
.
k
e
y
z.key = x.key
z.key=x.key和在11行之前测试
z
.
k
e
y
=
y
.
k
e
y
z.key = y.key
z.key=y.key的方法,来对TREE-INSERT
改进。如果相等,根据下面的策略之一来实现。对于每个策略,得到将
n
n
n个其中带有相同关键字的数据插入到一棵初始为空的二叉搜索树中的渐进性能。(对第5行描述的策略时比较
x
x
x和
z
z
z的关键字,用于第11行的策略是用
y
代
替
y代替
y代替x$。)
b. 在结点x设置一个布尔标志 x . b x.b x.b,并根据 x . b x.b x.b的值,置 x x x为 x . l e f t x.left x.left或 x . r i g h t x.right x.right。当插入一个结点与x关键字相同的结点时,每次访问 x x x时交替地 x . b x.b x.b为FALSE或TRUE。
采用这种策略时,多个相同关键字插入时,每个结点的左右子树高度叉不超过1。将形成一棵平衡的二叉搜索树,并在只有在第 k k k层填充后,才会填充下一层。因此渐进性能为 Θ ( n l g n ) \Theta(nlgn) Θ(nlgn)。下面时图示。下面的结点关键字均相同。
c. 在 x x x处设置一个与 x x x关键字相同的结点列表,并将 z z z插入到该表中。
相当于在结点处采用一个链表存储相同关键字的结点。因此,树的高度为0,采用前插法的方式,总的时间复杂度 O ( n ) O(n) O(n)。
d. 随机设置 x x x为 x . l e f t x.left x.left或 x . r i g h t x.right x.right。(给出最坏情况性能,并非形式化的导出期望运行时间。)
最坏情况下,所有结点均插入左子树或右子树。每次操作为 O ( n ) O(n) O(n),总的时间复杂度为 O ( n 2 ) O(n^2) O(n2)。期望运行时间,即选择左子树或右子树的概率相同,因此树会大致平衡,树的高度为 O ( l g n ) O(lgn) O(lgn)。总的时间复杂度为 n l g n ( n ) nlgn(n) nlgn(n)。