129.求根节点到叶节点数字之和
🌴 129.求根节点到叶节点数字之和
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字:
例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。
示例
示例 1:
|
|
解释: 从根到叶子节点路径 1->2 代表数字 12 从根到叶子节点路径 1->3 代表数字 13 因此,数字总和 = 12 + 13 = 25 示例 2:
|
|
解释: 从根到叶子节点路径 4->9->5 代表数字 495 从根到叶子节点路径 4->9->1 代表数字 491 从根到叶子节点路径 4->0 代表数字 40 因此,数字总和 = 495 + 491 + 40 = 1026
思路
基本思想
根节点到每一个叶子结点都会形成一个路径,路径上的数会组成一个数,将这些路径上组成的数全部加在一起即可
所以想到了回溯法,往下一层,形成的数多一位,往回一层,形成的数就会变少一位,但是都是在末尾进行操作,所以可以使用回溯法的模版处理问题
由于从根节点向下,为了能够判断是叶子节点,并且好回溯,向下递归时传递的是root->left
和root->right
,而不是root
,这是有原因的,因为当回溯到这一层时,如果传递的是root,就无法回溯,传递的是下一层的节点,回溯之后自然就回到了当前层节点
并且回溯之后,需要将形成的数字最后一位删除,一旦遇到叶子结点,就是形成了一个数,需要将其累加到sum中,sum不能丢失原来的值,所以定义为全局变量
回溯的模版就是先遍历这一层的一个节点,拿着这一层的一个去遍历下一层的所有节点,这个节点组合下一层的所有节点的情况都搜索完成,再拿当前层的下一个节点去统计下一层的所有节点。。。
这样一直搜索,最终可以将整棵树搜索完毕,每一个叶子结点都可以遍历到
执行流程
- 将根节点加入,否则根节点无法统计到
- 遇到叶子结点直接将形成的数累加到sum中
- 不是叶子结点,需要进行递归,并且当前节点的值需要加到形成的数中,具体的递归就是去搜索当前节点的左右孩子节点
- 当遍历了所有节点,统计完毕
- 返回sum当成最终的结果
代码
根据以上分析,得出以下代码:
|
|
总结
主要是回溯法形成的搜索路径,每遇到一个叶子结点说明形成了一个完整的路径,此时可以进行累加,一条完整的路径形成之后,需要搜索其他的路径,此时需要回溯,回溯时需要将当前数的后几位删除,可能是一位,可能是多位,取决于回溯了几步
当整棵树搜索完毕时,直接返回