Java 二叉搜索树在运行时不打印

标签 java binary-tree binary-search-tree

我创建了一个二叉搜索树类,我是按照一些 YouTube 视频制作的。问题是,据我所知,我的代码与我遵循的指南中的代码完全相同。问题是,当我运行 main() 方法时,什么也没有发生。没有编译或运行时错误,程序什么也不做。应该发生的是,如果我使用遍历方法,它应该使用 toString() 方法打印出一些键和这些键的值,或者如果我使用findNode() 方法。我希望有人可以检查我的代码,看看他们是否可以发现任何逻辑错误等,因为我花了很长时间检查和重新检查我的代码,但我似乎无法发现它。

这是我的主要方法的代码:

public class BinarySearchTreeAss2 {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        BinarySearchTree myTree = new BinarySearchTree();

        myTree.addNode(50, 1);
        myTree.addNode(25, 2);
        myTree.addNode(15, 3);
        myTree.addNode(30, 4);
        myTree.addNode(75, 5);
        myTree.addNode(80, 6);

        myTree.inOrderTraversal(myTree.root);
        System.out.println("\n\n");

        myTree.preOrderTraversal(myTree.root);
        System.out.println("\n\n");

        myTree.postOrderTraversal(myTree.root);
        System.out.println(myTree.findNode(30));
    }
}

二叉搜索树类的代码:

public class BinarySearchTree {
    Node root;

    public void addNode(int key, int value) {
        Node newNode = new Node(key, value);
        if(root == null) {
            root = newNode;
        } else {
            Node focusNode = root;
            Node parent;
            while(true) {
                parent = focusNode;
                if(key < focusNode.key) {
                    focusNode = focusNode.leftChild;
                    if(focusNode == null) {
                        parent.leftChild = newNode;
                        return;
                    } else {
                        focusNode = focusNode.rightChild;
                        if(focusNode == null) {
                            parent.rightChild = newNode;
                            return;
                        }
                    }
                }
            }
        }
    }

    public void inOrderTraversal(Node focusNode) {
        if(focusNode != null) {
            inOrderTraversal(focusNode.leftChild);
            System.out.println(focusNode);
            inOrderTraversal(focusNode.rightChild);
        }
    }

    public void preOrderTraversal(Node focusNode) {
        if(focusNode != null) {
            System.out.println(focusNode);
            preOrderTraversal(focusNode.leftChild);
            preOrderTraversal(focusNode.rightChild);
        }
    }

    public void postOrderTraversal(Node focusNode) {
        if(focusNode != null) {
            postOrderTraversal(focusNode.leftChild);
            postOrderTraversal(focusNode.rightChild);
            System.out.println(focusNode);
        }
    }

    public Node findNode(int key) {
        Node focusNode = root;
        while(focusNode.key != key) {
            if(key < focusNode.key) {
                focusNode = focusNode.leftChild;
            } else {
                focusNode = focusNode.rightChild;
            }
            if(focusNode == null) {
                return null;
            }
        }
        return focusNode;
    }
}

class Node {
    int key;
    int value;

    Node leftChild;
    Node rightChild;

    Node(int key, int value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public String toString() {
        return value + " has the key " + key;
    }
}

最佳答案

你弄乱了 if 语句大括号,这导致程序进入无限循环。

if (key < focusNode.key) {
    focusNode = focusNode.leftChild;

    if (focusNode == null) {
        parent.leftChild = newNode;
        return;
    }

    else {
        focusNode = focusNode.rightChild;

        if (focusNode == null) {
            parent.rightChild = newNode;
            return;
        }
    }
}

如果 key 小于 focusNode.key 则向左走,否则向右走,所以应该是这样

if (key < focusNode.key) {
    focusNode = focusNode.leftChild;

    if (focusNode == null) {
        parent.leftChild = newNode;
        return;
    }
} else {
    focusNode = focusNode.rightChild;

    if (focusNode == null) {
        parent.rightChild = newNode;
        return;
    }
}

关于Java 二叉搜索树在运行时不打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27302826/

相关文章:

javascript - 如何将数据插入nvd3条形图

java - 在树中查找节点 N

Javascript - 按顺序遍历二叉树。最后一个值正在打印 undefined

java - 在Java中显示二叉搜索树

java - 打印二叉树中所有大于或等于传入方法的值的方法

java - 解释java编译顺序

java - 如何执行 Spring Boot 配置文件并使用 java -jar 命令以及 mvn spring-boot :run command? 传递命令行参数

java - 为什么 Java 的 Integer 类没有 compare() 方法?

algorithm - 打印二叉树的边界

c - 二叉搜索树,删除节点