算法导论-12-1-具有相同关键字元素的二叉查找树

本文探讨了在二叉查找树中处理相同关键字的问题,分析了当n个具有相同关键字的数据项插入空树时的算法性能。提出了三种优化策略:通过布尔标志决定插入方向、在节点处设置列表存储相同关键字节点、以及随机选择插入子树。详细阐述了每种策略的实现方法及其插入性能,并提供了相应的代码实现。

题目:

相同关键字的存在,给二叉查找树的实现带来了一些问题。

a)当用TREE-INSERT将n个具有相同关键字的数据项插入到一棵初始为空的二叉查找树中时,该算法的渐近性能如何?

我们可以对TREE-INSERT做一些改进,即在第5行的前面测试key[z] = key[x],在第11行的前面测试key[z] = key[y]。如果等式成立,我们对下列策略中的某一种加以实现。对每一种策略,请给出将n个具有相同关键字的数据插入一棵初始为空的二叉查找树中的渐近性能(以下的策略是针对第5行的,比较的是z和x的关键字。将x换成y即可用于第11行)。

b)在结点x处设一个布尔标志b[x],并根据b[x]的不同值,置x为left[x]或right[x]。每当插入一个与x具有相同关键字的结点时,b[x]取TRUE或FALSE。

c)在结点x处设置一个列表,其中所有结点都具有与x相同的关键字,并将z插入到该列表中。

d)随机地将置为left[x]或right[x]

思考:

b)每次测试到等式成立时,若b[x]为FLASE,插入到左子树中,b[x]为TRUE时,插入到右子树中,然后将b[x]取反

c)使用一个链表,所有具有相同关键字的结点组成一个链表,结点中的一个指针指向这个链表

d)使用rand()%2随机地决定插入到左子树中还是右子树中

代码

b)

//二叉查找树结点的结构
struct node
{
	int key;//关键字
	int data;//卫星数据
	bool b;
	node *left;//左孩子
	node *right;//右孩子
	node *p;//父结点
	node(int x):key(x),data(x),b(0),left(NULL),right(NULL),p(NULL){}
};
//二叉查找树的结构
struct tree
{
	node *root;
	tree():root(NULL){}
};
//二叉查找树的插入
void Tre
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值