zoukankan      html  css  js  c++  java
  • [LeetCode]Path Sum系列

    1.二叉树路径求指定和,需要注意的是由于有负数,所以即使发现大于目标值也不能返回false,而且返回true的条件有两个,到叶节点且等于sum,缺一不可

    public boolean hasPathSum(TreeNode root, int sum) {
            if (root==null) return false;
            if (root.val==sum&&root.left==null&&root.right==null) return true;
            else return hasPathSum(root.left,sum-root.val)||hasPathSum(root.right,sum- root.val);
        }

    2.跟第一题的不同是要把所有路径返回,做法一样,把所有路径都遍历一遍,每次递归返回后都要回溯,把符合要求的路径记录

    public List<List<Integer>> pathSum(TreeNode root, int sum) {
            List<List<Integer>> tp=new ArrayList<List<Integer>>();
            List<Integer> cu=new ArrayList<Integer>();
            int total=0;
            dfs(root, tp, cu,total,sum);
            return tp;
        }
        public void dfs(TreeNode root,List<List<Integer>> tp, List<Integer> cu,int total,int sum){
            if(root==null)
            return;
            cu.add(root.val);
            total=total+root.val;
            if(root.left==null&&root.right==null&&total==sum){
                tp.add(new ArrayList(cu));
                return;
            }
            if (root.left!=null){
                dfs(root.left,tp, cu,total,sum);
                cu.remove(cu.size()-1);
            }
            if (root.right!=null){
                dfs(root.right,tp, cu,total,sum);
                cu.remove(cu.size()-1);
            }
        }

    3.不要求开头和结尾是根节点和叶节点,但是顺序必须自上而下,做法是递归的把所有节点都当做根节点判断一遍,每次判断时不同的地方是不用判断到没到叶节点,而且=target后不返回,只是结果+1,继续向下判断。

     public int pathSum(TreeNode root, int sum) {
            int cu=0;
            if (root == null)
                return 0;
            return dfs(root,sum,cu)+pathSum(root.left,sum)+pathSum(root.right,sum);
            // 开始的点不一定是根节点,采取的方法是返回根节点函数+左子节点函数+右子节点函数,这样递归后就可以实现所有节点都可以作为开始
        }
        public  int dfs(TreeNode root,int sum,int cu){
             int re=0;
             if (root == null)
                return re;
            cu+=root.val;
            if(cu == sum)
            re++;
            re+=dfs(root.left,sum,cu);
            re+=dfs(root.right,sum,cu);
            return re;
        }
  • 相关阅读:
    主要几种通信协议的性能比较(转载)
    mina与spring集成(翻译)
    DF标志和串传送指令
    编写不会产生除法溢出的子程序
    转: 匈牙利标记法
    转:四种方式实现从尾到头输出单向链表(链表逆序打印)
    汇编语言注释标记符
    汇编将数据以十进制格式显示在屏幕上
    转:汇编寄存器的使用
    蒙特卡罗算法 求数组主元素
  • 原文地址:https://www.cnblogs.com/stAr-1/p/8366769.html
Copyright © 2011-2022 走看看