二叉树总是为空

时间:2014-09-26 19:51:39

标签: java data-structures binary-tree inner-classes

我知道这里有很多类似的问题。我看过他们,但每个人的实施都不同,这让我很困惑。我正在尝试制作一棵二叉树。每次我插入一个元素,它就成了根本不是我想要的。如果我尝试从main方法访问root的数据或将root传递给另一个方法,我会得到一个空指针异常。任何人都可以告诉我为什么我的root总是为null,为什么我的insert方法没有为root赋值?关于更好地设计Java数据结构的任何提示也将非常受欢迎。

package interviewQuestions;

public class BinaryTree {
    private Node root = null;

    private class Node {
        int data;
        Node left;
        Node right;

        public Node(int dataval){
            data = dataval;
            left = null;
            right = null;
        }
    }

    // A binary search tree must have no duplicate nodes
    // Insert nodes into the tree. Return 1 on success.
    public int insert(Node root, int data){
        Node temp = root;
        if(root == null){
            Node node = new Node(data);
            root = node;
            System.out.println("new root is "+root.data);
            return 1;
        }
        else if(temp.data < data && temp.right != null){
            if(data < temp.right.data){
                Node node = new Node(data);
                node.right = temp.right;
                temp.right = node;
                return 1;
            }
            else{
                temp = temp.right;
                insert(temp, data);
            }
        }
        else if(temp.data < data && temp.right == null){
            Node node = new Node(data);
            temp.right = node;
            return 1;
        }
        else if(temp.data > data && temp.left != null){
            if(data > temp.left.data){
                Node node = new Node(data);
                node.left = temp.left;
                temp.left = node;
                return 1;
            }
            else{
                temp = temp.left;
                insert(temp, data);
            }
        }
        else if(temp.data > data && temp.left == null){
            Node node = new Node(data);
            temp.left = node;
            return 1;
        }
            return -1;
    }

    public void preOrder(Node root){
        if(root.left != null){
            System.out.println(root.data);
            root = root.left;
            preOrder(root);
        }
        else if(root.left == null && root.right != null){
            System.out.println(root.data);
            root = root.right;
            preOrder(root);
        }
        else if(root.left == null && root.right == null){
            return;
        }
    }

    // Remove

    // Find

    // Balance


    public static void main (String[] args){
        BinaryTree tree = new BinaryTree();

        tree.insert(tree.root, 5);
        tree.insert(tree.root, 2);
        tree.insert(tree.root, 8);
        tree.insert(tree.root, 1);
        tree.insert(tree.root, 3);
        tree.insert(tree.root, 9);
        tree.insert(tree.root, 20);
        tree.insert(tree.root, 10);
        tree.insert(tree.root, 15);

        System.out.println(tree.root);
        tree.preOrder(tree.root);
        System.out.println("Ya. everysing ees güten tag. YA.");
    }
}

1 个答案:

答案 0 :(得分:1)

当root是您的类中的私有变量时,您传入了一个根变量。修复insert语句以仅接收数据并将私有变量root更改为相等节点。

您的方法使其将参数root设置为node。这导致类root没有变化。

您不需要更改根目录的可见性。当您输入insert语句时,代码中有2个不同的根变量;您在类中声明的根以及作为参数传递的根。你只想要班里的那个