大家好,我是 @负雪明烛。点击右上方的「+关注,优质题解不间断!

题目大意

二叉树从根节点到叶子节点,是一条路径;把路径上的值,构成一个二进制数。

求根节点到叶子节点所有路径的构成数字之和。

解题方法

分析

本题让我们求「所有」路径之和,一个很简单的想法就是:使用一个变量,保存「已经访问过的所有」路径之和。

这样,当我们把所有路径都访问一遍以后,就能得到题目想要的结果。

我定义了全局的变量 res = 0,当每次遇到叶子节点的时候,就把整条路径的数字之和,累加到 res中。

由于在遍历过程到每个节点时的「路径和」都是不一样的,因此还需要一个变量 preSum表示在遇到当前节点的所有路径之和。

上述就是本题的思考过程。

递归

遇到二叉树的题目,一般都是 DFS 或者 BFS 解决。其中用到 DFS(递归) 场景更多。

在上面的分析中,我们发现可以把大问题划分成小问题:想要求「根节点」到「叶子节点」的路径构成的数字是多少,需要先求「根节点的子节点」到「叶子节点」的路径构成的数字是多少……

这就形成了递归。

递归函数的定义:到达节点 1022. 从根到叶的二进制数之和 - 图1的路径已经构成数字是 $preSum$; 求以当前1022. 从根到叶的二进制数之和 - 图2开始,访问到每个叶子节点路径构成的 $preSum$。

递归函数产生的副作用:当到达叶子节点时,把 1022. 从根到叶的二进制数之和 - 图3累加到全局变量 1022. 从根到叶的二进制数之和 - 图4中。

代码

代码如下:

  1. # Definition for a binary tree node.
  2. # class TreeNode(object):
  3. # def __init__(self, val=0, left=None, right=None):
  4. # self.val = val
  5. # self.left = left
  6. # self.right = right
  7. class Solution(object):
  8. def sumRootToLeaf(self, root):
  9. self.res = 0
  10. self.dfs(root, 0)
  11. return self.res
  12. def dfs(self, root, preSum):
  13. if not root: return
  14. preSum = preSum * 2 + root.val
  15. if not root.left and not root.right:
  16. self.res += preSum
  17. self.dfs(root.left, preSum)
  18. self.dfs(root.right, preSum)

复杂度

  • 时间复杂度:1022. 从根到叶的二进制数之和 - 图51022. 从根到叶的二进制数之和 - 图6是二叉树节点个数。
  • 空间复杂度:1022. 从根到叶的二进制数之和 - 图7,递归使用的栈空间。

    总结

  1. 二叉树,第一反映就是递归。

我是 @负雪明烛 ,刷算法题 1000 多道,写了 1000 多篇算法题解,收获阅读量 300 万。
关注我,你将不会错过我的精彩动画题解、面试题分享、组队刷题活动,进入主页 @负雪明烛 右侧有刷题组织,从此刷题不再孤单。