Java二叉树实现中的链接对象异常

时间:2019-07-14 14:38:13

标签: java data-structures binary-tree

我已经实现了一个简单的二叉树程序,但是在遍历树时遇到一个问题,只能访问根元素。我怀疑节点未链接。我尽力找出问题所在,但是代码没有发现任何问题。

我在退出该功能之前尝试从插入功能打印数据,该功能确实可以正确打印数据。

public class BinaryTree {

    Node root;

    public void addNode(int data){

        Node newNode = new Node(data);

        if(root == null){
            root = newNode;
        }
        else{
            Node currentNode = root;
            while(true){
                if(data <= currentNode.data){
                    currentNode = currentNode.leftChild;
                    if(currentNode == null){
                        currentNode = newNode;
                        return;
                    }
                } 
                else{
                    currentNode = currentNode.rightChild;
                    if(currentNode == null){
                        currentNode = newNode;
                        return;
                    }
                }
            }

        }
    }

    public void inorderTraversal(Node currentNode){

        if(currentNode != null){

            inorderTraversal(currentNode.leftChild);

            System.out.print(currentNode.data + " ");

            inorderTraversal(currentNode.rightChild);

        }
    }

}

2 个答案:

答案 0 :(得分:1)

实际上,您在递归步骤中没有将新节点正确地添加到树中。您应该使用的逻辑是,当到达一个节点,其左或右指针为null时,该新节点属于该方向,则应将新节点添加到左还是右。否则,请继续遍历直到到达该节点。

while(true) {
    if (data <= currentNode.data) {
        if (currentNode.leftChild == null) {
            currentNode.leftChild = newNode;
            return;
        }
        else {
            currentNode = currentNode.leftChild;
        }
    else {
        if (currentNode.rightChild == null) {
            currentNode.rightChild = newNode;
            return;
        }
        else {
            currentNode = currentNode.rightChild;
        }
    }
}

请记住,上述添加新节点的简单算法并不能保证一定会导致平衡的二叉树。为了确保这一点,您将不得不添加更多处理重新平衡的逻辑。

答案 1 :(得分:0)

您没有将元素分配给leftright子级。您只是将其分配给未链接到树的局部变量currentNode

按照下面的代码放入while循环中,它应该对您有用。

            if(data <= currentNode.data){
                if(currentNode.leftChild == null){
                    currentNode.leftChild = newNode;
                    return;
                }
                else {
                     currentNode = currentNode.leftChild;
                }
            } 
            else{
                if(currentNode.rightChild == null){
                    currentNode.rightChild = newNode;
                    return;
                }
                else {
                     currentNode = currentNode.rightChild;
                }
            }