zoukankan      html  css  js  c++  java
  • 每日一题

    题目信息

    • 时间: 2019-06-27

    • 题目链接:Leetcode

    • tag:二叉树 深度优先搜索 回溯法

    • 难易程度:中等

    • 题目描述:

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

    示例:

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

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

    返回:

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

    提示

    1.节点总数<=10000
    

    解题思路

    本题难点

    本问题是典型的二叉树方案搜索问题,使用回溯法解决,其包含 先序遍历 + 路径记录 两部分。

    具体思路

    • 先序遍历:按照 “根、左、右” 的顺序,遍历树的所有节点。
    • 路径记录: 在先序遍历中,记录从根节点到当前节点的路径。当路径为 ① 根节点到叶节点形成的路径 ② 各节点值的和等于目标值 sum 时,将此路径加入结果列表。

    值得注意的是,记录路径时若直接执行 res.append(path) ,则是将 path 对象加入了 res ;后续 path 改变时, res 中的 path 对象也会随之改变。

    代码

    class Solution {
      //结果列表 res
        List<List<Integer>> res = new LinkedList<>();
      //路径列表 path
        LinkedList<Integer> path = new LinkedList<>(); 
        public List<List<Integer>> pathSum(TreeNode root, int sum) {
            recur(root,sum);
            return res;
        }
    
        void recur(TreeNode root,int tar){
          //终止条件: 若节点 root 为空,则直接返回。
            if(root == null){
                return;
            }
          //路径更新: 将当前节点值 root.val 加入路径 path 
            path.add(root.val);
          //目标值更新: tar = tar - root.val(即目标值 tar 从 sum 减至 0 );
            tar -= root.val;
          //路径记录: 当 ① root 为叶节点 且 ② 路径和等于目标值 ,则将此路径 path 加入 res 。
            if(tar == 0 && root.left == null && root.right == null){
                res.add(new LinkedList(path));
            }
          //先序遍历: 递归左 / 右子节点。
            recur(root.left,tar);
            recur(root.right,tar);
          //路径恢复: 向上回溯前,需要将当前节点从路径 path 中删除,即执行 path.removeLast() 。
            path.removeLast();
        }
    }
    

    复杂度分析:

    • 时间复杂度 O(N) : N 为二叉树的节点数,先序遍历需要遍历所有节点。
    • 空间复杂度 O(N) : 最差情况下,即树退化为链表时,path 存储所有树节点,使用 O(N) 额外空间。

  • 相关阅读:
    [ jquery 选择器 :hidden ] 此方法选取匹配所有不可见元素,或者type为hidden的元素
    剑指 Offer 03. 数组中重复的数字 哈希
    LeetCode 1736. 替换隐藏数字得到的最晚时间 贪心
    Leetcode 1552. 两球之间的磁力 二分
    Leetcode 88. 合并两个有序数组 双指针
    LeetCode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?
    LeetCode 1743. 相邻元素对还原数组 哈希
    LeetCode 1745. 回文串分割 IV dp
    剑指 Offer 47. 礼物的最大价值 dp
    剑指 Offer 33. 二叉搜索树的后序遍历序列 树的遍历
  • 原文地址:https://www.cnblogs.com/ID-Wangqiang/p/13218622.html
Copyright © 2011-2022 走看看