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();
        }
    }
  • 相关阅读:
    java中this关键字
    java继承
    java super关键字
    java String类型存储详解
    java四种访问权限修饰符
    C/C++语言void及void指针深层探索【转】
    Linux Epoll介绍和程序实例【转】http://blog.csdn.net/sparkliang/article/details/4770655
    服务器与wp7的socket通信【转】 http://www.cnblogs.com/linzheng/archive/2011/06/21/2086456.html
    android关于socket编程,以聊天为例【转】http://hi.baidu.com/yaoyuanhuajx/item/9b93d7565f315ba9acc857d7
    Tesseract 3 语言数据的训练方法【转】http://blog.csdn.net/dragoo1/article/details/8439373
  • 原文地址:https://www.cnblogs.com/Howfars/p/13274958.html
Copyright © 2011-2022 走看看