当前位置: 首页 > 知识库问答 >
问题:

Java二叉搜索树-工作不正确的插入方法

刘泰
2023-03-14

我有一个Java中的二叉搜索树作业,其中给了我完整的树和节点类,还有一个SearchTree类,我要在其中完成搜索和插入方法。搜索应该返回对应于所搜索键的节点的值。

这里是树类,这里是节点类。我的搜索和插入方法如下。

看来我已经接近了,但是将键0和值2插入树[node[0,1,null,null]]的测试结果是树[node[0,1,null,null]]而不是正确的树[node[0,2,null,null]]。这里我有什么不理解的?

public static Object search(Tree tree, int key) {
    Node x = tree.getRoot();
    while (x != null) {
        if (key == x.getKey()) {
            return x.getValue();
        }
        if (key < x.getKey()) {
            x = x.getLeft();
        } else {
            x = x.getRight();
        }            
    }
    return null;
}

public static void insert(Tree tree, int key, Object value) {
    if (tree.getRoot() == null) {
        tree.setRoot(new Node(key, value));
    }
    Node juuri = tree.getRoot();
    while (juuri != null) {
        if (key == juuri.getKey()) {
            return;
        } else if (key < juuri.getKey()) {
            if (juuri.getLeft() == null) {
                juuri.setLeft(new Node(key, value));
                return;
            } else {
                juuri = juuri.getLeft();
            }
        } else {
            if (juuri.getRight() == null) {
                juuri.setRight(new Node(key, value));
                return;
            } else {
                juuri = juuri.getRight();
            }
        }
    }
}

共有1个答案

裴良弼
2023-03-14

我看到的问题是,你的树中的关键值是唯一的。在这个if语句中,如果您看到键已经在树中,则保留insert方法而不添加节点。

 if (key == juuri.getKey()) { 
      return;
 }

在您的示例中(如果我理解正确的话),0已经在树中,所以再次插入0时没有任何变化。基于您的示例,我假设您希望在密钥相同的情况下对节点进行更新。所以这段代码可以做到这一点。

if (key == juuri.getKey()) {
     juuri.setValue(value);
     return;
}
 类似资料:
  • public static void main(String[]args){main main=new main();

  • 我正在研究数据结构,我遇到了一个难题。目标是根据数组元素的值将数组元素插入到二叉搜索树中,即(主树的根节点为数组[0],左子树的根_node小于父节点,右子树的根节点大于父节点)。这将递归进行,直到所有数组元素都插入BST。 我实现了两个类: 这表示具有属性的节点(数据,左,右): 是BST的私有方法,它执行将节点插入树的实际工作。我将其与分开,因为需要使用RSpec评估的预期解决方案。 然后,我

  • 二叉搜索树(BST)和二叉树(BT)中的插入有什么区别?我知道,在BST中,您将新节点的值与根进行比较,如果较小,则添加到其左侧,如果较大,则将其添加到根的右侧。BT的程序是否相同?如果没有,插入和移除的步骤是什么?

  • 我搜索了一下,但没有找到这个问题的答案... 我构建了一个非二叉树,因此每个节点可以有任意数量的子节点(我认为称为n元树) 为了有助于搜索,我在构建树的时候给了每个节点一个编号,这样每个节点的子节点会更大,它右边的所有节点也会更大。 像这样的东西: 这样我就有更多的时间进行搜索 当我想插入节点时,问题就来了。如果我想在除了结尾以外的任何地方插入节点,这个模型就不起作用了。 我想了几种方法可以做到这

  • 我有一个表示二叉树节点的树节点的树节点。 } 我有一个BinarySearchTree类 问题是当我创建一个子节点并设置父子链接时。父节点的值(我传递的节点对象)也会更新并引用子对象。 那不是我的本意。 我想创建一个treenode对象链,可以通过“根”treenode对象访问它。 但这并没有发生,我不明白我做错了什么。 我知道问题出在这个代码片段的逻辑上(不仅仅是为了在左边插入,也是为了在左边和

  • 这里是我试图实现的BST,但是remove方法不会删除具有给定值的节点。我试着这样做: 首先检查当前节点(我要删除的节点)是否有正确的子节点。 1.2.1)如果右子节点有一个左子节点,则我将当前节点替换为最小节点,该最小节点大于当前节点,并替换为右子树中最左侧的节点 1.2.2)如果没有,我就用它的正确子节点替换当前节点,但是代码没有删除选中的节点,哪里出错了?