LeetCode 1022:二叉树路径二进制求和解析与实现

发布时间:2026/8/3 8:50:47
LeetCode 1022:二叉树路径二进制求和解析与实现 1. 问题背景与需求分析今天我们来拆解LeetCode第1022题从根到叶的二进制数之和。这是一道典型的二叉树遍历问题结合了二进制计算的特性。题目要求我们计算从根节点到每个叶子节点的路径所表示的二进制数的总和。举个实际例子假设我们有如下二叉树1 / \ 0 1 / \ / \ 0 1 0 1那么从根到叶的路径有1→0→0 表示二进制100即十进制41→0→1 表示二进制101即十进制51→1→0 表示二进制110即十进制61→1→1 表示二进制111即十进制7 总和就是456722这道题的价值在于考察对二叉树遍历的掌握程度训练二进制与十进制转换的思维培养路径累积计算的编程技巧是许多互联网公司面试的常见题型2. 解题思路与算法选择2.1 深度优先搜索(DFS)方案DFS是最直观的解法因为它天然适合处理路径累积问题。我们可以采用前序遍历的方式在向下递归时传递当前路径的二进制值到达叶子节点时将结果累加。具体步骤从根节点开始初始路径值为0每向下访问一个节点将当前值左移1位(相当于×2)并加上当前节点值如果是叶子节点将当前值加入总和递归处理左右子树时间复杂度O(N)需要访问每个节点一次 空间复杂度O(H)递归栈的深度等于树的高度2.2 广度优先搜索(BFS)方案BFS也可以解决这个问题但需要额外存储每个节点对应的路径值。我们可以使用队列同时存储节点和对应的当前值。实现步骤初始化队列放入根节点和值0从队列取出节点和当前值计算新值 (当前值 1) | 节点值如果是叶子节点累加到总和将非空子节点和新值放入队列重复直到队列为空时间复杂度同样为O(N)但空间复杂度在最坏情况下可能达到O(N)因为要存储所有节点的信息。3. 代码实现与细节解析3.1 Python DFS实现class Solution: def sumRootToLeaf(self, root: TreeNode) - int: def dfs(node, current_sum): if not node: return 0 current_sum (current_sum 1) | node.val if not node.left and not node.right: return current_sum return dfs(node.left, current_sum) dfs(node.right, current_sum) return dfs(root, 0)关键点说明使用嵌套函数dfs实现递归current_sum 1等价于乘以2| node.val相当于加上当前节点值到达叶子节点时返回当前值否则返回左右子树的和3.2 Java BFS实现class Solution { public int sumRootToLeaf(TreeNode root) { if(root null) return 0; QueuePairTreeNode, Integer queue new LinkedList(); queue.offer(new Pair(root, 0)); int sum 0; while(!queue.isEmpty()) { PairTreeNode, Integer pair queue.poll(); TreeNode node pair.getKey(); int current pair.getValue(); current (current 1) | node.val; if(node.left null node.right null) { sum current; } if(node.left ! null) { queue.offer(new Pair(node.left, current)); } if(node.right ! null) { queue.offer(new Pair(node.right, current)); } } return sum; } }注意事项使用Pair同时存储节点和当前值每次从队列取出时更新当前值只有到达叶子节点时才累加需要处理空树的特殊情况4. 边界条件与测试用例4.1 常见边界情况空树应该返回0单节点树返回节点自身的值完全左斜树或右斜树所有节点值相同的情况大型树(测试递归深度)4.2 推荐测试用例# 测试用例1示例中的树 # 1 # / \ # 0 1 # / \ / \ # 0 1 0 1 # 预期输出22 # 测试用例2单节点树 # 1 # 预期输出1 # 测试用例3全0树 # 0 # / \ # 0 0 # / \ / \ # 0 0 0 0 # 预期输出0 # 测试用例4左斜树 # 1 # / # 1 # / # 1 # 预期输出7 (111二进制)5. 算法优化与变种问题5.1 空间优化技巧对于DFS递归解法虽然代码简洁但在极端情况下(如树退化为链表)可能导致栈溢出。可以改用迭代式DFSdef sumRootToLeaf(root): if not root: return 0 stack [(root, 0)] total 0 while stack: node, current stack.pop() current (current 1) | node.val if not node.left and not node.right: total current if node.right: stack.append((node.right, current)) if node.left: stack.append((node.left, current)) return total5.2 相关问题扩展计算所有路径表示的十进制数的乘积找出二进制路径值最大的叶子节点计算路径值的平均值将问题扩展到n叉树的情况输出所有路径对应的二进制字符串6. 面试技巧与常见错误6.1 面试官可能问的问题为什么选择DFS而不是BFS如何处理非常大的树(递归深度问题)如果不允许使用位运算如何实现如何修改算法来记录所有路径时间复杂度和空间复杂度分析6.2 常见错误与纠正忘记处理空树的情况在非叶子节点就进行累加位运算优先级错误(应该使用括号明确)递归终止条件写错在BFS实现中忘记同时存储节点和当前值提示在面试中建议先明确问题要求画出示例树解释思路后再编码。注意边界的处理写完代码后主动用测试用例验证。7. 实际应用场景虽然这个问题看起来是纯算法题但其核心思想在实际中有广泛应用文件系统路径的权限检查网络路由表的匹配算法决策树的路径概率计算游戏中的技能树解锁判断自动化测试中的UI操作路径记录理解这种路径累积模式可以帮助我们解决许多树形结构相关的实际问题。比如在微服务调用链分析中我们可能需要统计各种调用路径的出现频率其核心算法与本题非常相似。