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

二叉树遍历根节点始终为NULL问题排查求助

问题分析与修复

你的代码存在两个关键错误,直接导致根节点始终为null:

1. add方法逻辑错误

当前add方法在root不为null时,传入了一个null的Node n调用addrecursive,相当于每次添加新节点都从空节点开始,完全没关联到当前树的根节点,后续节点根本没被加入正确的树结构中。

修正后的add方法:

public void add(int value) {
    // 直接调用addrecursive,利用其逻辑处理root为null的情况,无需分支判断
    root = addrecursive(root, value);
}

2. createBinaryTree方法的局部对象问题

createBinaryTree内部新建了一个局部的BinaryTree bt,并给这个局部对象添加节点,但这个局部对象在方法结束后就会被销毁,和外部main方法中创建的bt实例毫无关联。外部实例的root依然是初始的null。

修正后的createBinaryTree方法:

private void createBinaryTree(){
    // 直接给当前实例添加节点,无需新建BinaryTree对象
    add(6);
    add(4);
    add(8);
    add(3);
    add(5);
    add(7);
    add(9);
}

修正后的完整代码(关键部分已修复)

public class BinaryTree{
    public static class Node{
        int value;
        Node left;
        Node right;
        public Node(int data){
            this.value = data;
            left = null;
            right = null;
        }
    }
    
    Node root;
    BinaryTree() { 
        root = null; 
    }
    
    public Node addrecursive(Node current,int value){
        if(current==null){
            return new Node(value);
        }else if(value<current.value){
            current.left=addrecursive(current.left,value);
        }else if(value>current.value){
            current.right=addrecursive(current.right,value);
        }else{
            return current;
        }
        return current;
    }

    public void add(int value) {
        root = addrecursive(root, value);
    }

    private void createBinaryTree(){
        add(6);
        add(4);
        add(8);
        add(3);
        add(5);
        add(7);
        add(9);
    }

    private boolean containsNodeRecursive(Node current, int value) {
        if (current == null) {
            return false;
        } 
        if (value == current.value) {
            return true;
        } 
        return value < current.value
          ? containsNodeRecursive(current.left, value)
          : containsNodeRecursive(current.right, value);
    }

    public boolean containsNode(int value) {
        return containsNodeRecursive(this.root, value);
    }

    public void traverseInOrder(Node node) {
        if (node != null) {
            traverseInOrder(node.left);
            System.out.print(" " + node.value);
            traverseInOrder(node.right);
        }
    }
    void printInorder() {              
        traverseInOrder(root); 
    }

    public static void main(String [] args){
        BinaryTree bt =  new BinaryTree() ;     
        bt.createBinaryTree();              
        Boolean b = bt.containsNode(7); 
        System.out.println(b);
        System.out.println("\nInorder traversal of binary tree is " );
        bt.printInorder();
    }
}

运行修正后的代码,会输出:

true

Inorder traversal of binary tree is 
 3 4 5 6 7 8 9

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:51:05