V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lm66058
V2EX  ›  问与答

求助关于 Java 创建二叉树的问题

  •  
  •   lm66058 · 2020-05-06 00:00:21 +08:00 · 927 次点击
    这是一个创建于 1613 天前的主题,其中的信息可能已经有所发展或是发生改变。

    [输入形式]

    首先输入一个 n ( 0 到 n-1 编号)表示树中节点的个数,接下来 n-1 行每行有两个整数 a,b,表示 a 是 b 的父亲(建树统一先建左孩子后建右孩子),最后分别输出前序,中序,后续遍历的编号(每种遍历结果占一行,每行每个编号之间有一个空格,输出的第一个编号前没有空格,输出的最后一个编号后没有空格)。例如:4 个节点,1 是 0 的左孩子,2 是 0 的右孩子,3 是 1 的左孩子。

    [输出形式]

    输出前、中、后序遍历结果

    [样例输入]

    4

    0 1

    0 2

    1 3

    [样例输出]

    0 1 3 2

    3 1 0 2

    3 1 2 0

    核心代码:

    public class Tree { int data; Tree lChild = null; Tree rChild = null;

    public Tree(int data) {
        this.data = data;
    }
    
    public Tree() {
    }
    
    public Tree CreatTree(Tree tree, int flag, int child) {
        Tree t;
        t = find(tree, flag);
        if (t.lChild != null) {
            t.rChild = new Tree(child);
        } else {
            t.lChild = new Tree(child);
        }
        return tree;
    }
    
    private Tree find(Tree t, int data) {
        Tree temp;
        if (t != null) {
            if (t.data == data) {
                return t;
            } else {
                if (t.lChild != null) {
                    temp = find(t.lChild, data);
                    return temp;
                }
                if (t.rChild != null) {
                    temp = find(t.rChild, data);
                    return temp;
                }
            }
        }
        return null;
    }
    
    public void PreOrderTree(Tree t) {
        if (t != null) {
            System.out.print(t.data + " ");
            PreOrderTree(t.lChild);
            PreOrderTree(t.rChild);
        }
    
    }
    
    public void InOrderTree(Tree t) {
        if (t != null) {
            InOrderTree(t.lChild);
            System.out.print(t.data + " ");
            InOrderTree(t.rChild);
        }
    }
    
    public void LaOrderTree(Tree t) {
        if (t != null) {
            LaOrderTree(t.lChild);
            LaOrderTree(t.rChild);
            System.out.print(t.data + " ");
        }
    }
    

    }

    为什么我的程序一直创建左子树不报错,创建右子树就会报空指针错误,求大神指点
    
    第 1 条附言  ·  2020-05-06 00:56:55 +08:00
    luckyrayyy
        1
    luckyrayyy  
       2020-05-06 00:30:25 +08:00
    “为什么我的程序一直创建左子树不报错,创建右子树就会报空指针错误”没看懂你的提问
    lm66058
        2
    lm66058  
    OP
       2020-05-06 00:34:30 +08:00 via Android
    @luckyrayyy 就是创建孩子结点时会报空指针错,比如按照样例输入的时候能正常输出,如果输入
    5
    0 1
    1 2
    1 5
    5 6
    输入到 5 6 的时候就会报空指针错误
    luckyrayyy
        3
    luckyrayyy  
       2020-05-06 00:50:18 +08:00 via iPhone   ❤️ 1
    @lm66058 你的 find 方法返回值有可能是 null,然后 CreteTree 方法里的有可能是 null,你再给 t 的属性赋值可不就空指针了
    lm66058
        4
    lm66058  
    OP
       2020-05-06 01:01:25 +08:00
    @luckyrayyy 可是输入 5 6 之前数值为 5 的结点已经初始化并赋值了,为什么还是会报空指针错误,我把全部代码上传了,大佬帮我看看哪里出问题了
    lm66058
        5
    lm66058  
    OP
       2020-05-06 01:28:37 +08:00
    @luckyrayyy 感谢大神指点迷津,已经解决了
    luckyrayyy
        6
    luckyrayyy  
       2020-05-06 08:58:34 +08:00
    @lm66058 这种问题实在太低级了,你看错误日志,肯定会告诉你哪一行空指针了,你就看那一行里哪有可能为 null 。另外针对你这种简单的逻辑,其他 IDE 不知道,至少 idea 就会提醒你有可能出现空指针,你肯定没看 ide 的 warn 。希望能解决渔的问题而不只是鱼的问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   896 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:27 · PVG 07:27 · LAX 16:27 · JFK 19:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.