【算法】——排列树

本文探讨如何通过递归算法生成数列的子集,以排列树的形式展示。通过层次分析,利用数组与树节点的关系,左子树代表1,右子树代表0,实现从数组到子集的转换。在递归过程中,当达到指定层数时输出子集。
摘要由CSDN通过智能技术生成

有这样一个问题,比如说,让我们去求数列br={1,2,3}的所有子集。我们知道它的真子集有{1,2,3}、{1,2}、{1,3}、{2,3}、{1}、{2}、{3}、空集。一共八个。那我们怎么通过代码的方式实现它呢?
首先,我们来分析这样一个程序,如下:

int fun(int i, int n)
{
	if (i >= n)
	{
	}
	else
	{
		fun(++i, n);//一般不用后置加加,会无穷递归,栈溢出
		fun(++i, n);
	}
}
int main()
{
	fun(0, 3);
}

如果我们把它与树的结构来展现,他会是什么样子呢?用层次分析法分析,如下图:
在这里插入图片描述
由上图我们可知,我们可以利用递归的方式来完成左右子树相关值的创建。那就进入正题,怎么求数列的一个子集呢。仔细观察这些子集,我们可以发现用数组来存放这些子集,数值与下标位置相对应,再用1表示有数字,0表示没有数字,展现结果如下:
在这里插入图片描述
再将此数组对应到树形结构上,左子树表示1,右子树表示0,就可以完全的表示出子集了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值