• 剑指offer——二叉树中和为某一值的路径


    二叉树中和为某一值的路径

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

    解:在这个题目中,求二叉树指定路径,判断条件就是在叶子结点处,此时target==0

    而要想求一棵二叉树一条路径的长度的话,只有前序遍历可以实现,故在利用递归来进行二叉树的前序遍历,然后求解和,且求解时,先将该结点加入到list中,然后分别递归左右结点,计算加入该结点之后,target的值是否与路径的和相等

    编程时注意要点:

    1.list的删除:开始时使用的是list.remove(list.size() - 1);,这样是不对的

    应该用list.remove(list.size() - 1);来删除最后一个结点,进行回退。

    2.ArrayList<ArrayList<Integer>> arrayLists的添加,开始时用的是 arrayLists.add(list); 就是添加不上去

    后来看答案;使用的是arrayLists.add(new ArrayList<>(list));(依然想不明白)

    import java.util.ArrayList;
    /**
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
    
        }
    
    }
    */
    public class Solution {
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
            ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<>();
            if(root == null) return arrayLists;
            ArrayList<Integer> list = new ArrayList<>();
            getPath(arrayLists, list, root, target);
            return arrayLists;
        }
        public void getPath(ArrayList<ArrayList<Integer>> arrayLists, ArrayList<Integer> list, TreeNode root, int target){
            if(root == null){
                return;
            }
            list.add(root.val);
            target -= root.val;
    
            if(target == 0 && root.left == null && root.right == null){
                arrayLists.add(new ArrayList<>(list));
            } else{
                getPath(arrayLists, list, root.left, target);
                getPath(arrayLists, list, root.right, target);
    
            }
            list.remove(list.size() - 1);
        }
    }
    

      

     重新写的,没想用先序遍历

    public class Solution {
        public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
            ArrayList<ArrayList<Integer>> res = new ArrayList<>();
            if(root == null || target == 0) return res;
             
            ArrayList<Integer> path = new ArrayList<>();
            findPath(root, target, res, path);
            return res;
        }
     
        public void findPath(TreeNode root, int target,
                             ArrayList<ArrayList<Integer>> res, ArrayList<Integer> path){
            if(root == null) return;
            if(root.left == null && root.right == null){
                if(target == root.val){
                    path.add(root.val);
                    ArrayList<Integer> help = new ArrayList<>();
                    for(int i = 0; i < path.size(); i++){
                        help.add(path.get(i));
                    }
                    res.add(help);
                    path.remove(path.size()-1);
                }
                return;
            }
     
            path.add(root.val);
            findPath(root.left, target-root.val, res, path);
            findPath(root.right, target-root.val, res, path);
            path.remove(path.size()-1);
        }
    }
    

      

  • 相关阅读:
    CDH Mysql元数据库升级
    greenplum gpcheckperf 命令(GP集群压力测试)
    centos7 升级openssh到openssh-8.0p1版本(转)
    正则表达式中的 1
    Docker系列03—Docker 基础入门
    Docker系列01—容器的发展历程
    二进制安装部署 4 kubernetes集群---超详细教程
    kubernetes系列11—PV和PVC详解
    kubernetes系列10—存储卷详解
    kubernetes系列09—Ingress控制器详解
  • 原文地址:https://www.cnblogs.com/SkyeAngel/p/8664633.html
Copyright © 2020-2023  润新知