【JAVA】【刷题子】1022.从根到叶的二进制数之和

203 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

一、题目、需求与分析

题目

  给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。
  - 例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。
  对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。
  返回这些数字之和。题目数据保证答案是一个 32 位 整数。
(题目来源:力扣:1022.从根到叶的二进制数之和

需求与分析

题目比较简单哈,我们也过一下它具体所想表达意思。就是找出所有从根到叶的路径
例1:(1->0,1->1)
image.png
那么,它的计算值就为:(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)
image.png
它对应的计算值就是:(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:如果是下面的例子呢,这时候应该会了吧?
image.png
它对应的计算值就是:(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;
	}
}

三、结果展示

image.png

四、总结

根的终点可能不是叶子,也有可能是它自身。(终点即起点,从哪里跌倒从那里重新开始。)

题目数据库

Gitee:传送门

文章小尾巴

文章写作、模板、文章小尾巴可参考:《写作“小心思”》
  感谢你看到最后,最后再说两点~
  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
  我是南方者,一个热爱计算机更热爱祖国的南方人。

  (文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)