求解「转换为和树」问题时遇空指针错误,请求排查
解决二叉树转换为和树的空指针异常问题
错误原因
报错Cannot read field "data" because "root.left" is null是因为处理叶子节点时,其left和right子节点均为null,代码直接访问root.left.data或root.right.data触发了空指针异常。
问题分析
你的代码存在两处核心问题:
- 未判断子节点是否为
null就直接访问其data字段; - 逻辑不符合预期输出:根据给出的预期结果,叶子节点最终值为0,说明节点新值应为所有子节点(含后代)的原有值之和,自身原有值需要向上传递给父节点参与计算。
修正后的代码
public class BinaryTree09 { static class Node{ int data; Node left; Node right; Node(int data){ this.data = data; this.left = null; this.right = null; } } public static int transform(Node root){ if(root == null){ return 0; } // 递归计算左右子树的总和(包含子节点自身原有值) int leftSum = transform(root.left); int rightSum = transform(root.right); // 保存当前节点的原有值 int originalData = root.data; // 当前节点新值 = 左右子树的总和(匹配预期输出的子节点值之和) root.data = leftSum + rightSum; // 返回当前节点原有值 + 左右子树总和,供父节点计算使用 return originalData + leftSum + rightSum; } // 辅助函数:前序遍历打印二叉树,验证转换结果 public static void printTree(Node root) { if (root == null) return; System.out.print(root.data + " "); printTree(root.left); printTree(root.right); } public static void main(String[] args) { /** 1 / \ 2 3 / \ / \ 4 5 6 7 */ /*Expected Output 27 / \ 9 13 / \ / \ 0 0 0 0 */ Node root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); root.right.left = new Node(6); root.right.right = new Node(7); transform(root); // 打印结果:前序遍历应为 27 9 0 0 13 0 0 printTree(root); } }
修正说明
- 移除了直接访问
null子节点data的代码,改为通过递归返回的leftSum和rightSum完成计算; - 调整逻辑:
transform函数返回当前节点原有值 + 左右子树总和,用于父节点计算其新值;- 当前节点的新值设为
leftSum + rightSum,完全匹配你给出的预期输出;
- 新增
printTree函数,方便验证转换后的二叉树结构。
内容的提问来源于stack exchange,提问作者Nishant Paliwal
相关产品推荐
相关产品推荐

