zoukankan      html  css  js  c++  java
  • Medium | LeetCode 113 | 剑指 Offer 34. 二叉树中和为某一值的路径 | 回溯

    剑指 Offer 34. 二叉树中和为某一值的路径

    难度中等120

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

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

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

    返回:

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

    提示:

    1. 节点总数 <= 10000

    解决思路

    使用回溯算法, 递归子树时, 将其目标和减去当前节点, 即子树需要达到的目标。并且当当前节点计算完成回溯时, 需要将之前添加的当前的节点删除。

    private List<List<Integer>> resList = new ArrayList<>();
    
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        if(root == null) {
            return resList;
        }
        pathSum(root, sum, new ArrayList<Integer>());
        return resList;
    }
    
    private void pathSum(TreeNode root, int sum, List<Integer> res) {
        // 递归出口
        if (root == null) {
            return;
        }
        // 递归出口 递归到根节点
        if (root.left == null && root.right == null) {
            if (root.val == sum) {
                res.add(root.val);
                resList.add(new ArrayList<>(res));
                res.remove(res.size()-1);
            }
            return;
        }
        // 添加当前节点
        res.add(root.val);
        // 递归左子树
        pathSum(root.left, sum - root.val, res);
        // 递归右子树
        pathSum(root.right, sum - root.val, res);
        // 当前节点计算完成, 需要回溯, 从路径中删除当前节点
        res.remove(res.size()-1);
    }
    
  • 相关阅读:
    haproxy的使用
    zookeeper 的多线程和单线程库使用对比
    zookeeper 简介
    将博客搬至CSDN
    Sublime Text 添加eclipse快捷键
    Atom编辑器添加eclipse快捷键
    Linux安装mysql教程
    设计模式
    设计模式
    设计模式
  • 原文地址:https://www.cnblogs.com/chenrj97/p/14283285.html
Copyright © 2011-2022 走看看