数据结构:zyf树/毒瘤树

本文介绍了宗法树,一种类似平衡树的数据结构,由dalao发明并传授,支持插入、删除、查询等功能。宗法树的性质包括二叉树、数字存在叶子节点、非叶子节点存储子树最大/最小值等。文章详细阐述了各功能的实现过程,并提供了优化方法以防止递归时间过长。此外,还提到了宗法树在洛谷P3369问题中的应用。
摘要由CSDN通过智能技术生成

upd:把它叫成宗法树被lxl骂了,现在改一下

ps:由于CSDN没有替换功能,而且博主很懒,所以下面名字不改,大家清楚就好(逃

一看题目是不是很懵逼?

那就对了!

这个数据结构本来是没有名字的,由一个毒瘤dalao发明并传给讲师,讲师再交给我们。

至于这个名字,则是学员中一位毒瘤想到的。原因待会儿再讲。

为了方便,以下就称这种数据结构为“宗法树”。

宗法树是一种类似于平衡树的数据结构,但似乎更简单。它支持以下6种功能:

1、插入x

2、删除x(若有多个x,只删除一个)

3、求x的排名(严格比x小的数的个数+1)

4、求第x个数(同上)

5、求x的前驱(最大的小于x的数)

6、求x的后继(最小的大于x的数)

以上6种功能均为平衡树基本功能,但用代码量更小的宗法树也可以实现。

宗法树的性质:

1、是一棵二叉树

2、它的数字都存在叶子节点里

3、非叶子节点存储子树的最大值/最小值

4、每个非叶子节点的左子树里的数全都小于右子树里的数。

5、每个非叶子节点都必须有两棵子树

比如这样一棵宗法树:

而下面,我将按顺序讲解每一种功能的实现。

1、插入

以上面那棵宗法树为例,如果我们想插入6:

1、从根节点出发,发现左儿子的值是5<6,于是向右儿子递归

2、发现5号节点是叶子节点,于是在5号节点下方再建两个新节点6、7

3、5号节点原来的值9>6,所以将9放到右儿子,6放到左儿子

4、回溯更新

插入结果:

代码实现:

void insert(int &k,int x)
{
	if (!k)//没有这个点,即第一次插入 
	{
		new_tr(k,x);//动态开点 
		return;
	}
	if (leaf(k))//叶子节点 
	{
		new_tr(tr[k].lson,min(x,tr[k].v));//建左儿子 
		
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值