[算法练习-剑指offer]题24.二叉树中和为某一值的路径(Java)

题目

题号:24
题目名:二叉树中和为某一值的路径

编程语言

Java

题目描述

输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

初次思路

有一说一,题目描述阅读比题难

简而言之就是给你一个数,你找到从根节点到叶子节点所有值加起来等于target,将所有值放到一个数组返回。

很明显就是dfs,需要注意的是要用减枝回溯提高速率

解题代码

public class Solution {
    ArrayList<ArrayList<Integer>> res = new ArrayList<>();

    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
        if (root == null) return res;
        ArrayList<Integer> list = new ArrayList<>();
        dfsFind(list, root, target);
        return res;
    }

    private void dfsFind(ArrayList<Integer> list, TreeNode root, int target) {
        list.add(root.val);//加入当前值
        //如果是叶子节点
        if(root.left==null&&root.right==null) {
            if (target-root.val == 0) {
                res.add(new ArrayList<>(list));//将List拷贝一份加入res,这样回溯时候不会影响最终结果
            }
            return;
        }
        //如果左子树不为空,递归左子树
        if(root.left!=null) {
            dfsFind(list, root.left, target - root.val);
            list.remove(list.size() - 1);//剪枝回溯
        }
        //如果右子树不为空,递归右子树
        if(root.right!=null) {
            dfsFind(list, root.right, target - root.val);
            list.remove(list.size() - 1);//剪枝回溯
        }

    }
}

算法练习代码我都开源在码云上,有需要的朋友可以看看

https://gitee.com/xiaoxiaoyuworkspace/offeralgorithm

猜你喜欢

转载自blog.csdn.net/qq_41522089/article/details/107622117
今日推荐