优雅地解决二叉树路径求和问题

106 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第38天,点击查看活动详情 >>

优雅地解决二叉树路径求和问题

今天我们来学习一下关于二叉树路径求和的问题,首先我们先来看看下面的具体题目分析:

题目分析

对于给定的二叉树我们需要对它的路径进行求和,看看是否存在路径之和等于target目标值的路径,如果存在该种路径,则返回true,否则返回false。

注意:这里所指的路径是要求从根节点一直到叶子结点的完整路径。

算法分析

这一次我们先介绍递归的方法,看看递归法师如何解决这类问题的。

递归方法就是需要思考一下,在二叉树深度遍历的时候,如何进行自己的业务处理(即如何判断该路径是否符合题目要求,即路径之和与目标值相等)

在实现的过程中,我们需要一个“递归”量sum,由它来进入到每一层递归中去统计。

另外由于这里是深度遍历,所以在遇到叶子结点的时候,就证明有一条路径走到了最后,此时就需要判断该路径之和是否等于目标值。如果等于目标值则修改布尔标志变量。

话不多说,咱们直接来看下面的具体实现:

算法代码的具体实现:

首先我们需要定于一个全局变量(布尔标志变量)

boolean tag = false;

递归调用函数:

    public boolean hasPathSum(TreeNode root, int targetSum) {
        getPathSum(root, 0, targetSum);
        return tag;
    }

递归函数:

    public int getPathSum (TreeNode root, int sum, int targetSum) {
        if (root == null) {
            return sum;
        }
        sum += root.val;
        if (root.left == null && root.right == null) {
            if (sum == targetSum) {
                tag = true;
            }
        }
        int left = getPathSum(root.left, sum, targetSum);
        int right = getPathSum(root.right, sum, targetSum);
        return 0;
    }

通过上述代码,相信各位朋友都已经可以掌握整体的思路了,实际上就是通过递归统计Sum,再和target比较。

另外,递归函数中的返回值,其实是不需要的,所以代码可以改进为以下所示:

        public void getPathSum(TreeNode root, int sum, int targetSum) {
            if (root == null) {
                return;
            }
            sum += root.val;
            if (root.left == null && root.right == null) {
                if (sum == targetSum) {
                    tag = true;
                }
            }
            getPathSum(root.left, sum, targetSum);
            getPathSum(root.right, sum, targetSum);
        }

总结;

本次文章就和大家一起学习了如何去解决二叉树所有路劲中是否存在路径之和与目标值相等的问题,这次的递归方法也是非常常用和好理解的。

如果各位朋友细心点的话,会发现在使用递归的时候,其实也隐含了回溯的思想,只不过这次的代码处理很是巧妙:

它将 sum当做是递归函数的参数这样的话,左递归和右递归都不对相互影响,可以很好地解决问题。

\