• 剑指Offer——树的子结构二叉树中和为某一值的路径


    1、题目描述

      输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

    2、代码实现

    package com.baozi.offer;
    
    import java.util.ArrayList;
    
    /**
     * 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
     * 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
     * (注意: 在返回值的list中,数组长度大的数组靠前)
     *测试用例:
     *       0
     *     /   
     *    1     2
     *   /    / 
     *  3  4  5   6
     *         
     *          7
     * @author BaoZi
     * @create 2019-07-12-19:21
     */
    public class Offer20 {
        public static void main(String[] args) {
            TreeNode root = new TreeNode(0);
            TreeNode t1 = new TreeNode(1);
            TreeNode t2 = new TreeNode(2);
            TreeNode t3 = new TreeNode(3);
            TreeNode t4 = new TreeNode(4);
            TreeNode t5 = new TreeNode(5);
            TreeNode t6 = new TreeNode(6);
            TreeNode t7 = new TreeNode(7);
            root.left = t1;
            root.right = t2;
            t1.left = t3;
            t1.right = t4;
            t2.left = t5;
            t2.right = t6;
            t5.right = t7;
            Offer20 offer20 = new Offer20();
            ArrayList<ArrayList<Integer>> arrayLists = offer20.FindPath(root, 4);
            for (int i = 0; i < arrayLists.size(); i++) {
                for (int j = 0; j < arrayLists.get(i).size(); j++) {
                    System.out.print("--->"+arrayLists.get(i).get(j) );
                }
            }
        }
    
        ArrayList<ArrayList<Integer>> listAll = new ArrayList<>();
        ArrayList<Integer> list = new ArrayList<>();
    
        public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
            if (root == null) {
                return listAll;
            }
            list.add(root.val);
            target -= root.val;
            if (target == 0 && root.left == null && root.right == null) {
                //这里必须是把list重新创建一个然后添加进listAll中,因为原来的list还要进行下边的操作
                listAll.add(new ArrayList<Integer>(list));
            }
            FindPath(root.left, target);
            FindPath(root.right, target);
            //这里使用的是回溯思想,当如果某一条路径走到尽头但是target的值不为0的话,需要把最后一个节点的值减去
            list.remove(list.size() - 1);
            return listAll;
        }
    }
    

      

  • 相关阅读:
    [LeetCode#260]Single Number III
    1 sql server中添加链接服务器
    1 sql server 中cursor的简介
    1 .net将xml反序列化
    1 C# 将对象序列化
    1 SQL SERVER 实现字符串分割成table的方法
    1 asp.net 中如何把用户控件应用于母版页
    1 .net中自定义事件的步骤
    .NET中跨线程访问winform控件的方法
    1 sql server 中merge的用法
  • 原文地址:https://www.cnblogs.com/BaoZiY/p/11178046.html
Copyright © 2020-2023  润新知