算法从入门到放弃——第二期

本文探讨了如何实现二叉树和多叉树的全排列算法,并介绍了剪枝技术在优化全排列过程中的应用。通过示例代码展示了无重复元素的全排列模板,强调在实际操作中理解递归执行过程对于问题解决的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树回溯全排列:

    //回溯树型全排列
    public static void dfs(TreeNode currentNode, List<Integer> templist, List<List<Integer>> result) {
        if (currentNode == null) {
            return;
        }
        templist.add(currentNode.val);
        if (currentNode.left == null && currentNode.right == null) {
            result.add(new ArrayList<>(templist));
            templist.remove(templist.size() - 1);
            return;
        }
        dfs(currentNode.left, templist, result);
        dfs(currentNode.right, templist, result);
        templist.remove(templist.size() - 1);
    }

多叉树型全排列+剪枝(各种类型的剪枝只需要不同条件的continue就行)

 //多叉树型全排列+剪枝
    public static void btree(int[] arr, boolean[] used, List<Integer> templist, List<List<Integer>> result) {
        if (templist.size() == arr.length) {
            result.add(new ArrayList<>(templist));
            return;
        }

        for (int i = 0; i < arr.length; i++) {
            if (used[i]) {
                continue;
            }
            if (i > 0 && arr[i - 1] == arr[i] && !used[i - 1]) {
                continue;
            }
            used[i] = true;
            templist.add(arr[i]);
            btree(arr, used, templist, result);
            templist.remove(templist.size() - 1);
            used[i] = false;
        }
    }

不需要剪枝的全排列模板

    //无重复全排列
    public static void btreetest(int[] arr, List<Integer> templist, List<List<Integer>> result) {
        if (templist.size() == arr.length) {
            result.add(new ArrayList<>(templist));
            return;
        }

        for (int i = 0; i < arr.length; i++) {
            if (templist.contains(arr[i])) {
                continue;
            }
            templist.add(arr[i]);
            btreetest(arr, templist, result);
            templist.remove(templist.size() - 1);
        }
    }

使用时需要把问题抽象成对应的树,选择合适的树,看是否需要减枝。最后再套模板,debug的时候最好能跟一下,看看程序里到底是怎么执行递归的,有助于你在遇到复杂问题时更好的剪枝。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值