持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
一、题目、需求与分析
题目
给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。
- 例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。
对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。
返回这些数字之和。题目数据保证答案是一个 32 位 整数。
(题目来源:力扣:1022.从根到叶的二进制数之和)
需求与分析
题目比较简单哈,我们也过一下它具体所想表达意思。就是找出所有从根到叶的路径
例1:(1->0,1->1)
那么,它的计算值就为:(10)+(11) = (2^1)+(2^1+2^0) = 2+2+1 = 5
例2:(1->0->0,1->0->1,1->1->0,1->1->1)
它对应的计算值就是:(100)+(101)+(110)+(111) = (2^2)+(2^2+2^0)+(2^2+2^1)+(2^2+2^1+2^0) = 4+4+1+4+2+4+2+1 = 22
依次类推... 例3:如果是下面的例子呢,这时候应该会了吧?
它对应的计算值就是:(1000)+(101)+(110)+(111) = (2^3)+(2^2+2^0)+(2^2+2^1)+(2^2+2^1+2^0) = 8+4+1+4+2+4+2+1 = 26
好了,分析就结束了,开始进入代码设计吧!
二、整体逻辑与主要代码
整体逻辑
整体就是考验深度优先搜索,也就是DFS。层层递进,在最上面进入到最底部,直到不能往下走才回到最上面,依次持续,把所有路径都走了,把问题化小就好了。
主要代码
思路比较清晰了吧,那就直接看代码吧!
(如有不懂的或者更好的建议,欢迎评论区分享友友的看法哈~)
class Solution {
public int sumRootToLeaf(TreeNode root) {
return getSumByDFs(root, 0);
}
// 深度优先DFs
public int getSumByDFs(TreeNode root, int sum)
// DFs深度优先出口
if (null == root) {
return 0;
}
// 统计计算值
sum = sum * 2 + root.val;
// 当左节点或右节点存在节点时,进行往下遍历
if (null != root.left || null != root.right) {
// 往下进行
return getSumByDFs(root.left, sum) + getSumByDFs(root.right, sum);
}
return sum;
}
}
三、结果展示
四、总结
根的终点可能不是叶子,也有可能是它自身。(终点即起点,从哪里跌倒从那里重新开始。)
题目数据库
Gitee:传送门
文章小尾巴
文章写作、模板、文章小尾巴可参考:《写作“小心思”》
感谢你看到最后,最后再说两点~
①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
我是南方者,一个热爱计算机更热爱祖国的南方人。
(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)