You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求解「转换为和树」问题时遇空指针错误,请求排查

解决二叉树转换为和树的空指针异常问题

错误原因

报错Cannot read field "data" because "root.left" is null是因为处理叶子节点时,其left和right子节点均为null,代码直接访问root.left.data或root.right.data触发了空指针异常。

问题分析

你的代码存在两处核心问题:

  1. 未判断子节点是否为null就直接访问其data字段;
  2. 逻辑不符合预期输出:根据给出的预期结果,叶子节点最终值为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);
    }
}

修正说明

  1. 移除了直接访问null子节点data的代码,改为通过递归返回的leftSum和rightSum完成计算;
  2. 调整逻辑:
    • transform函数返回当前节点原有值 + 左右子树总和,用于父节点计算其新值;
    • 当前节点的新值设为leftSum + rightSum,完全匹配你给出的预期输出;
  3. 新增printTree函数,方便验证转换后的二叉树结构。

内容的提问来源于stack exchange,提问作者Nishant Paliwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:33:15