常考数据结构与算法----给定一个二叉树和一个值 sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径,

题目描述

给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径,
例如:
给出如下的二叉树,sum=22,

返回
[
[5,4,11,2],
[5,8,9]
]

示例1

输入

{1,2},1

返回值

[]

示例2

输入

{1,2},3

返回值

[[1,2]]

思路:使用递归

  1.  从根节点开始,遍历每一个结点(深度优先遍历),将该结点的值放入当前ArrayList中

  2. 判断当前结点是否为叶子结点 以及 当前的路径和是否与sum相等 

  3. 步骤2中的两个条件都满足时,则将list加入到结果集中。否则回退,删除list的最后一个元素(该元素可能不是叶节点,也可能当前路径不等于sum)

import java.util.ArrayList;

public class TreeNodePutSum {
    private ArrayList<ArrayList<Integer>> allList = new ArrayList();

    public static void main(String[] args) {

    }

    /**
     *
     * @param root TreeNode类
     * @param sum int整型
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> pathSum (TreeNode root, int sum) {

        // 树空
        if(root==null){
            return allList;
        }
        //1.初始当前的列表
        ArrayList<Integer> pathList = new ArrayList();
        // 2.深度优先遍历
        dfs(allList,pathList,root,sum);

        //3.返回路径集合
        return allList;
    }

    //一、对root进行深度优先遍历
    //result:所有路径和为sum的结果集  list:当前路径结点集  root:当前根节点  sum:当前所需的路径和
    public void dfs(ArrayList<ArrayList<Integer>> allList,ArrayList<Integer> pathList, TreeNode root, int sum){
        if(null == root){
            return;
        }

        if(null == root.left && null == root.right){//为叶子节点
            if(sum - root.val == 0){//加上该结点后,满足路径和sum
                pathList.add(root.val);//将当前结点加入list
                allList.add(new ArrayList<>(pathList));//将当前路径 加入 结果集
                pathList.remove(pathList.size()-1);//去掉当前结点,继续下面的遍历
            }

            return;
        }

        pathList.add(root.val);
        dfs(allList,pathList, root.left, sum-root.val);
        dfs(allList,pathList, root.right, sum-root.val);
        pathList.remove(pathList.size()-1);
    }
}

猜你喜欢

转载自blog.csdn.net/m0_37564426/article/details/113880162