JAVA leetCode 113 &&剑指offer34 二叉树中和为某一值的路径解题思路

题目
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

示例:
给定如下二叉树,以及目标和 sum = 22,

          5
         / \
        4   8
       /   / \
      11  13  4
     /  \    / \
    7    2  5   1

返回:

[
[5,4,11,2],
[5,8,4,5]
]

分析

首先,这道题就是要从根节点杀到叶子结点,所以我们从遍历的算法上,并没有什么好优化的地方
其次,这道题要求存的是每条路径,这就意味着,我们要用一种回溯,不管找到还是没找到,我们的路径都要可以回到前面的结点

代码

    List<List<Integer>> path = new ArrayList<>();   //记录总的结果
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        LinkedList<Integer> list = new LinkedList();        //涉及频繁的增加、删除操作 我们选用linkedList
        pathSearch(root,sum,list);
        return path;
    }
    public void pathSearch(TreeNode node,int sum,LinkedList<Integer> list){
        if (node==null)                         
            return;
        sum -= node.val;                
        if (node.left==null&&node.right==null){ //到了叶子结点 如果sum==0 说明符合要求
            if (sum==0){
                list.addLast(node.val);
                path.add(new ArrayList<>(list));
                list.pollLast(); //注意要将其弹出
            }
            return; //不管是否符合要求 到了叶子结点就应该结束 回溯到上一个结点     
        }
        list.addLast(node.val);
        pathSearch(node.left,sum,list);
        pathSearch(node.right,sum,list);
        list.pollLast();    //注意要将其弹出 注意是左右结点都搜寻过的了 所以可以放心的弹出 这样存放路径的最后一个结点就会回退到上一个
    }
原创文章 14 获赞 52 访问量 1492

猜你喜欢

转载自blog.csdn.net/weixin_44233929/article/details/105621529
今日推荐