二叉树中和为某一值的路径(面试题34)

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

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

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

返回:

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

提示:

节点总数 <= 10000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

一、题解

1.1 思路

本题是典型的二叉树搜索问题,采用回溯法,包括先序遍历 + 路径记录。

先序遍历:按照“根-左-右”的方式遍历节点;

路径记录:在先序遍历中,如果满足:

  • 当前路径为根节点到叶子节点的一条路径

  • 当前路径的和等于目标和

    就将当前路径加入res中。

helper()算法流程:

(1)终止条件:当前节点为null,返回

(2)递推条件:

  • 路径更新:将当前节点加入路径;
  • 目标值更新:sum = sum - root.val;
  • 路径记录:当前路径满足条件,则加入res;
  • 先序遍历:递归遍历左右子树;
  • 路径恢复:向上回溯前,将当前节点从路径中删除

1.2 代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
   List<List<Integer>> res = new ArrayList<List<Integer>>();
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        if(root == null)
            return res;
        helper(root, sum, new ArrayList<Integer>());
        return res;
    }

    private void helper(TreeNode root, int sum, ArrayList<Integer> list){
        if(root == null){
            return;
        }
        list.add(root.val);
        sum = sum - root.val;
        if(root.left == null && root.right == null && sum == 0){
            res.add(new ArrayList<Integer>(list));
        }
        helper(root.left, sum, list);
        helper(root.right, sum, list);
        list.remove(list.size() - 1);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。