树实现集合与运算

如图,2棵树表示2个集合,用一个数组存储多棵树

注意:(1).用树表示集合,树的每一个节点代表集合中的一个元素,并且从上到下,从左到右放从小到大的元素

(2)如何表示这2棵树?用数组存储每一个元素的data和该元素parent的位置,无parent则用-1表示

集合元素的查找:

int find(Set s[ ],int x){
	int i;
	for(i=0;i<s.size&&s[i].data!=x;i++);
	if(i>=s.size) return -1;//查找元素的位置
	
	for(;s[i].parent>=0;i=s[i].parent);//查找根元素的位置
}

注意:(1).s是数组,里面是多个树放在里面的

集合的合并:

void union(Set s,int x1,int x2){
	//因为一个数组s,可以存放多棵树,所以只传入s和要查找的值即可
	int root1,root2;
	root1=find(s,x1);//大树的根
	root2=find(s,x2);//小树的根
	if(root1!=root2) s[root2].parent=root1;
}

注意:(1).首先要分别指导要合并的2个元素的根节点,如果根节点相同,则证明是同一课树

(2).如果根节点不同,则把小树的根节点的parent指向大叔的根节点

(3).那如何确定每一颗树的元素个数呢?我们需要让根节点记录树的元素个数,其他节点没必要记录,这样可以节省内存空间,因为根节点的parent是不存在的,我们之前用-1表示,现在可以用-(树中的元素个数)表示,比如有7个元素,根节点的parent就为-7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值