每日一省之———— 递归 + 回溯 求集合的幂集

算法求解过程示意图


import java.util.ArrayList;
import java.util.List;

/**
 * 所谓幂集(Power Set), 就是一个集合中所有的子集(包括全集和空集)作为元素构成的集合。
 * 
 * 该类通过遍历一棵满二叉树,求解集合的幂集。程序的原理是:把求幂集元素的过程看作是在先序遍历一棵深度为n+1的满二叉树,
 * 从根节点开始,访问左孩子表示幂集元素(集合的子集)中包含集合的第一个元素,访问右孩子表示幂集元素中不包含集合的
 * 第一个元素,这样,在二叉树的第二层完成了对集合第一个元素的取舍,依次类推,当遍历到达第n+1层,也就是二叉树的叶
 * 子节点时,完成了集合所有元素的取舍,这时输出一个取舍后的幂集元素。满二叉树的第n+1层共有2n个叶子节点,代表了集
 * 合的2n个幂集元素,待遍历输出完整棵满二叉树的叶子节点,也就得到了我们要求的幂集。
 */
public class PowerSetFinder<V>
{

    public static void main(String[] args)
    {
        // 初始化一个集合,放在list里面
        List<String> list = new ArrayList<String>();
        list.add("A");
        list.add("B");
        list.add("C");
        list.add("D");
        List<String> li = new ArrayList<String>();
        printPowerSet(0, list, li);

        System.out.println();
        System.out.println("-------------------------------------------------");
        System.out.println();

        List<Integer> list1 = new ArrayList<Integer>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list1.add(4);
        List<Integer> li1 = new ArrayList<Integer>();
        printPowerSet(0, list1, li1);
    }

    /**
     * 递归 + 回溯 求幂集
     * @param i
     * @param list
     * @param li
     * @author lhever 2017年2月21日 下午11:50:21
     * @since v1.0
     */
    public static <V> void  printPowerSet(int i, List<V> list, List<V> li)
    {

        if (i > (list.size() - 1))
        {
            System.out.println(li);
        } else
        {
            li.add(list.get(i));// 左加
            printPowerSet(i + 1, list, li); // 递归方法
            li.remove(list.get(i)); // 右去
            printPowerSet(i + 1, list, li);
        }
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值