112. 路径总和

题目

112. 路径总和_第1张图片

解析

拿到这道题的第一个想法就是算出从根结点到叶子结点的和的所有情况然后比较是否和sum相同,所以肯定是要用到递归的。先从最简单的一种情况开始分析:



5作为根结点,先判断4结点下面是否有叶子结点,没有则判断5+4是否等于sum(根结点+左叶),如果等于sum,那么就找到了答案,如果不等于sum,那么就判断5+8是否等于sum(根结点+右叶)。如果4下面有叶子结点,也就是下面这种情况:


112. 路径总和_第2张图片

根据上面一步,我们已经计算出(5+4)和(5+8)了,发现其都不等于sum,这个时候就需要往下继续寻找了,把(5+4)的值保存起来,然后再加上此时的左叶结点的值11,或者把(5+8)的值保存起来,然后加上此时的左叶结点/右叶结点计算判断是否和sum相等,以此类推。
此时,我们便可以抽象出一个简单的算法流程
112. 路径总和_第3张图片

当然,这都是要在还未找到匹配值以及node结点不空的情况下才成立的。
下面附上代码.

代码

public class Main {

    public static void main(String[] args) {
        TreeNode t1 = new TreeNode(5);
        t1.left = new TreeNode(4);
        t1.right = new TreeNode(8);
        t1.left.left = new TreeNode(11);
        t1.right.left = new TreeNode(13);
        t1.right.right = new TreeNode(4);
        t1.left.left.left = new TreeNode(7);
        t1.left.left.right = new TreeNode(2);
        t1.right.right.right = new TreeNode(1);

//        TreeNode t2 = new TreeNode(1);

        Main main = new Main();
        System.out.println(main.hasPathSum(t1, 1));
    }

    boolean isOk = false;

    public boolean hasPathSum(TreeNode root, int sum) {
        handle(root, 0, sum);
        return isOk;
    }


    public void handle(TreeNode node, int temp, int sum) {
        if (!isOk && node != null) {
            if (node.left == null && node.right == null && node.val + temp == sum) {
                isOk = true;
            }
            if (node.left != null) {
                handle(node.left, node.val + temp, sum);
            }
            if (node.right != null) {
                handle(node.right, node.val + temp, sum);
            }
        }
    }

你可能感兴趣的:(112. 路径总和)