• 剑指offer系列22--二叉树中和为某一值的路径


    22【题目】输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
    *     路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径
    * 【思路】只要从根结点到叶结点一条一条遍历;
    *      如果到了叶结点,且此路径值跟目标值相同,就添加此路径;
         不是,则从孩子子节点开始查找。

       【注】叶结点遍历完后要删除此叶结点值直至返回到父节点。

     1 package com.exe5.offer;
     2 
     3 import java.util.ArrayList;
     4 
     5 /**
     6  * 22【题目】输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
     7  *          路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径
     8  *   【思路】只要从根结点到叶结点一条一条遍历;
     9  *          如果到了叶结点,且此路径值跟目标值相同,就添加此路径;
    10                         不是,则从孩子子节点开始查找。
    11  * @author WGS
    12  *
    13  */
    14 public class FindTreePath {
    15 
    16     public static class TreeNode{
    17         int val=0;
    18         TreeNode left=null;
    19         TreeNode right=null;
    20         public TreeNode(int n){
    21             this.val=n;
    22         }
    23     }
    24     public ArrayList<ArrayList<Integer>> getFindPaths(TreeNode root,int target){
    25         ArrayList<Integer> nodeList=new ArrayList<>();
    26         ArrayList<ArrayList<Integer>> pathList=new ArrayList<>();
    27         if(root==null) return pathList;    
    28         int currentSum=0;
    29         return findPaths(pathList,nodeList,root,target,currentSum);
    30         
    31     }
    32     private ArrayList<ArrayList<Integer>> findPaths(ArrayList<ArrayList<Integer>> pathList, ArrayList<Integer> nodeList,
    33             TreeNode root, int target, int currentSum) {
    34 
    35         currentSum+=root.val;
    36         nodeList.add(root.val);
    37         //如果是叶结点就判断与目标值是否相同,相同则添加此路径
    38         boolean isLeafNode=root.left==null && root.right==null;
    39         if(currentSum==target && isLeafNode==true){
    40             ArrayList<Integer> tempList=new ArrayList<>();
    41             for(Integer val:nodeList){
    42                 tempList.add(val);
    43             }
    44             //循环结束为一条路径,加到pathList
    45             pathList.add(tempList);
    46         }
    47         //如果不是叶结点,则使用递归继续判断左右子节点
    48         if(root.left!=null)
    49             findPaths(pathList, nodeList, root.left, target, currentSum);
    50         if(root.right!=null)
    51             findPaths(pathList, nodeList, root.right, target, currentSum);
    52         
    53         //遍历到叶结点后,要在返回到父节点之前,在路径上删除当前结点
    54         Integer val2=nodeList.remove(nodeList.size()-1);
    55         currentSum-=val2;
    56         return pathList;
    57     }
    58     
    59     public static void main(String[] args) {
    60         TreeNode root=new TreeNode(10);
    61         TreeNode node1=new TreeNode(5);
    62         TreeNode node2=new TreeNode(4);
    63         TreeNode node3=new TreeNode(7);
    64         TreeNode node4=new TreeNode(12);
    65         root.left=node1;
    66         root.right=node4;
    67         node1.left=node2;
    68         node1.right=node3;
    69         
    70         //ArrayList<ArrayList<Integer>> getList=new FindTreePath().getFindPaths(root, 22);
    71         ArrayList<ArrayList<Integer>> getList=new FindTreePath().getFindPaths(null, 0);
    72         System.out.println(getList.size());
    73         
    74         for (ArrayList<Integer> list : getList) {
    75             for (Integer integer : list) {
    76                 System.out.print(integer+" ");
    77             }
    78             System.out.println();
    79         }
    80     }
    81 
    82 }
  • 相关阅读:
    完美的隐藏软键盘方法
    Android开发——构建自定义组件
    android 中 系统日期时间的获取
    Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面
    总结:调用startActivityForResult,onActivityResult无响应的问题
    Android 頁面中有 EditText ,進入時取消自動彈出鍵盤
    Android中 Bitmap和Drawable相互转换的方法
    ImageView的属性android:scaleType
    动态添加组件(XML)
    Openfire3.8.2在eclipse中Debug方式启动最简单的方式
  • 原文地址:https://www.cnblogs.com/noaman/p/5461336.html
Copyright © 2020-2023  润新知