1. 问题理解与递归思路解析
今天我们来深入探讨一个有趣的二叉树问题——计算从根到叶所有路径形成的二进制数之和。这个问题看似简单,但蕴含着递归算法的精髓,特别适合用来理解二叉树的前序遍历和参数传递机制。
1.1 问题描述
给定一个二叉树,其中每个节点的值要么是0要么是1。我们需要找出所有从根节点到叶子节点的路径,将路径上的节点值组成二进制数,然后将所有这些二进制数转换为十进制后相加,返回最终的和。
举个例子,考虑如下二叉树:
code复制 1
/ \
0 1
/ \ / \
0 1 0 1
这个树有三条路径:
- 1→0→0:二进制100,十进制4
- 1→0→1:二进制101,十进制5
- 1→1→0:二进制110,十进制6
- 1→1→1:二进制111,十进制7
总和为4+5+6+7=22
1.2 递归解法核心思路
解决这个问题的关键在于理解如何在递归过程中维护当前路径的二进制值。我们需要:
- 从根节点开始遍历
- 在向下递归时,将当前路径的二进制值"携带"下去
- 遇到叶子节点时,将完整的二进制数加到总和中
- 递归返回时不需要携带值,因为我们已经完成了累加
这种"从前往后"传递参数的方式,正是递归算法中常用的技巧。与之相对的"从后往前"传递值(比如计算树的高度),则需要利用返回值。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码实现详解
让我们仔细分析给出的C++解决方案,理解每个部分的实现细节。
2.1 数据结构定义
cpp复制struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
这是标准的二叉树节点定义,包含:
val:节点值(0或
