zoukankan      html  css  js  c++  java
  • 输出和为指定值的路径

    题目:

      输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶子结点所经过的结点形成一条路径。这里只讨论简化版本,原题目的意思是路径不限制。

    思路:

      这种题目经过前面的学习很容易看出使用dfs来解决。这里还使用到了带前缀的dfs,可以和前面路径数字串之和这道题目对比学习。

    代码:

     1 import java.util.ArrayList;
     2 
     3 public class PrintPathWithSum {
     4     ArrayList<ArrayList<Integer>> res = new ArrayList<>();
     5 
     6     public ArrayList<ArrayList<Integer>> FindPath(TreeNode<Integer> root, int target) {
     7         if (root == null)
     8             return res;
     9         f(new ArrayList<Integer>(), root, target);
    10         res.sort((l1, l2) -> {
    11             return -l1.size() + l2.size();
    12         });
    13         return res;
    14     }
    15 
    16     void f(ArrayList<Integer> pre, TreeNode<Integer> node, int target) {
    17         ArrayList<Integer> _pre = new ArrayList<>();
    18         _pre.addAll(pre);
    19         _pre.add(node.val);
    20 
    21         if (node.left == null && node.right == null) {
    22             if (target - node.val == 0) {
    23                 res.add(_pre);
    24             }
    25             return;
    26         }
    27 
    28         if (node.left != null)
    29             f(_pre, node.left, target - node.val);
    30         if (node.right != null) {
    31             f(_pre, node.right, target - node.val);
    32         }
    33     }
    34 
    35     public static void main(String[] args) {
    36         PrintPathWithSum obj = new PrintPathWithSum();
    37         TreeNode<Integer> root = new TreeNode<>(1);
    38         TreeNode<Integer> l = new TreeNode<>(2);
    39         TreeNode<Integer> r = new TreeNode<>(3);
    40         TreeNode<Integer> ll = new TreeNode<>(8);
    41         TreeNode<Integer> lr = new TreeNode<>(6);
    42         TreeNode<Integer> rl = new TreeNode<>(7);
    43         TreeNode<Integer> rr = new TreeNode<>(4);
    44         TreeNode<Integer> lrl = new TreeNode<>(2);
    45         TreeNode<Integer> rrr = new TreeNode<>(2);
    46         TreeNode<Integer> rrrr = new TreeNode<>(1);
    47         root.left = l;
    48         root.right = r;
    49         l.left = ll;
    50         l.right = lr;
    51         r.right = rr;
    52         r.left = rl;
    53         lr.left = lrl;
    54         rr.right = rrr;
    55         rrr.right = rrrr;
    56         ArrayList<ArrayList<Integer>> lists = obj.FindPath(root, 11);
    57         for (ArrayList<Integer> list : lists) {
    58             System.out.println(list);
    59         }
    60     }
    61 
    62     public static class TreeNode<T> {
    63 
    64         public T val;
    65         public TreeNode<T> left = null;
    66         public TreeNode<T> right = null;
    67         public TreeNode<T> parent = null;
    68 
    69         public TreeNode(T val) {
    70             this.val = val;
    71         }
    72     }
    73 }

    结果:

      

  • 相关阅读:
    接下来是沉重的一堆任务啊!
    wxPython入门(一)
    一个比较好玩的东西——硬链接
    Python打印本机IP
    voddown.py v0.3 基本上就这样吧
    Python的正则表达式
    【转】Python命名习惯
    bat命令
    试用了GIMP的Smart remove selection,结果有些失望啊,哈哈
    STM32学习笔记(1)——搭建库函数工程
  • 原文地址:https://www.cnblogs.com/xiaoyh/p/10410106.html
Copyright © 2011-2022 走看看