zoukankan      html  css  js  c++  java
  • 剑指Offer_#34_二叉树中和为某一值的路径

    剑指Offer_#34_二叉树中和为某一值的路径

    Contents

    题目

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

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

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

    返回:

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

    提示:
    节点总数 <= 10000

    思路分析

    这一题要寻找和是某一值的路径,所以代码需要做两件事。

    1. 遍历所有的路径
      • 深度优先遍历,前序遍历(根-左-右),采用递归写法
      • 这里需要借助一个类似于的结构来实现,因为每一次遍历到树的叶节点之后,需要回溯到父节点,继续遍历其他的叶节点,也就是需要把最后加入的一个叶节点弹出(后进先出)。但是这里需要把整个容器的所有数字都写入res,所以我们采用LinkedList
    2. 记录每一条路径的值的和,如果刚好到路径末尾了,且当前的和就是目标值,将其加入res列表
      • 在每一次访问到一个节点时,要把当前节点的值加到一个记录的变量当中

    解答

    写法1:递减

    class Solution {
        LinkedList<List<Integer>> res = new LinkedList<>();
        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){
            //出口条件:遍历到叶节点
            if(root == null) return;
            //将当前节点的值加入到path当中
            path.add(root.val);
            tar -= root.val;
            if(tar == 0 && root.left == null && root.right == null)
                //为什么这里需要new?
                //path是全局变量,把当前的path对象内容拷贝到一个新的对象中,否则,res当中加入的path之后会发生变化
                res.add(new LinkedList(path));
            recur(root.left, tar);
            recur(root.right, tar);
            //这是LinkedList特有的方法,所以path初始化的时候,左边必须写成是LinkedList才能调用这个方法
            path.removeLast();
        }
    }

    写法2:累加

    class Solution {
        LinkedList<Integer> path= new LinkedList<>();
        LinkedList<List<Integer>> res = new LinkedList<>();
        int sum;
        public List<List<Integer>> pathSum(TreeNode root, int sum) {
            this.sum = sum;
            recur(root,0);
            return res;
        }
    
        void recur(TreeNode node, int curSum){
            if(node == null) return;
            curSum += node.val;
            path.add(node.val);
            if(curSum == sum && node.left == null && node.right == null)
                res.add(new LinkedList(path));
            recur(node.left,curSum);
            recur(node.right,curSum);
            path.removeLast();
        }
    }
  • 相关阅读:
    web服务器-Apache
    nginx优化
    nginx下载限速
    nginx-URL重写
    HDU 5358 First One 求和(序列求和,优化)
    HDU 5360 Hiking 登山 (优先队列,排序)
    HDU 5353 Average 糖果分配(模拟,图)
    UVALive 4128 Steam Roller 蒸汽式压路机(最短路,变形) WA中。。。。。
    HDU 5348 MZL's endless loop 给边定向(欧拉回路,最大流)
    HDU 5344 MZL's xor (水题)
  • 原文地址:https://www.cnblogs.com/Howfars/p/13274958.html
Copyright © 2011-2022 走看看