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