每日打卡:求根节点到叶节点数字之和

101 阅读3分钟

这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字:

例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和 。

叶节点 是指没有子节点的节点。

输入:root = [1,2,3] 输出:25 解释: 从根到叶子节点路径 1->2 代表数字 12 从根到叶子节点路径 1->3 代表数字 13 因此,数字总和 = 12 + 13 = 25

原题链接

其实题做得稍微多一点,应该就有一种感觉,就比如说,我们在第一眼看到这道题的时候,我们就因该知道肯定是深度遍历和广度遍历相关,那我们再根据我们的做题的要求,她是想要我们从头结点到子节点的一串数字然后相加,那我们整个数就被分为一条一条的,所以相比较下来,肯定是我们的深度遍历更加适合。

有忘记我们的两种遍历的可以看一下这篇文章

每日打卡:二叉树的层序遍历 - 掘金 (juejin.cn)

我们可以看一下我们整道题的逻辑,树顶的值在前面,叶子节点在最后,我们不能一下子就知道树顶的值需要乘以10的几次方,所以不如我们换一个思路就是,我们每向下一级,我们就乘以一个10

当我们想到使用深度遍历的时候,我们就应想到我们使用递归的方式去完成我们的遍历

    public int sumNumbers(TreeNode root) {
        return sun(root,0);
    }
    public int sun(TreeNode root,int i){
        //节点为空,返回0
        if(root == null) return 0;
        //获取我们此时树顶值,并加上上一次树顶(进入下一层的时候*10)
        int x = i*10 + root.val;
        //两个节点都为空,就是叶子节点,返回值
        if(root.right==null && root.left == null)return x;
        return sun(root.left,x)+sun(root.right,x);
    }

就是有些时候,这代码写起来虽然十分简单,但是做起来的时候可能就是想不出来,或者用了一种十分麻烦的方式做出来了,我觉得做算法题,就和做数学题差不多,大家可能很多时候做过了很多类型题,但是不懂去怎么变换,不能通过一种题想到另一种方式,最开始看到题的时候,一筹莫展,看一眼题解,瞬间清晰,这种问题还是挺大的,尽量还是忍住,不去看题解,当自己解出来的时候再去看。

我看到官方题解还有广度遍历的解法,大家其实也可以去看看,开阔一下思路,但是广度遍历肯定会十分麻烦,因为我们在实现广度遍历的时候就使用了队列,此时还要判断层数,以及每个节点的上下层是什么,就更加的麻烦了。