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

Java二叉搜索树插入方法不起作用

汪同
2023-03-14
public void insertLeft(E key, T value) {
    Node<E, T> node = new Node<E, T>(key, value);
    if (root == null) {
        root = node;
    } else {
        Node current = root;
        while (current.left != null) {
            current = current.left;
        }
        current.left = node;
    }
}

//User friendly THE ONLY THING THAT DOES NOT WORK!!!!!!!
public boolean insert(E key, T value) {
    return insert(root, key, value);
}

public boolean insert(Node position, E key, T value) {
    if (position == null) {
        root = new Node<E, T>(key, value);
        return true;
    }
    int comparison = position.key.compareTo(key);
    if (comparison > 0) {
        if (position.left == null) {;
            position.left = new Node<E, T>(key, value);
            return true;
        }
        return insert(position.left, key, value);
    } else if (comparison < 0) {
        if (position.right == null) {
            position.right = new Node<E, T>(key, value);
            return true;
        }
        return insert(position.right, key, value);
    } else {
        return false;
    }
}

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

    BinaryTree bst = new BinaryTree();
    //ADD DATA Oshiro stuff
    String namesList = "Walt Lawrence Ken Jennifer David Walter Phil Scotty "
            + "Todd Leonard Kara Michelle Jill Steven Wynn Lloyd Brandon Gary"
            + " Jim Dale Joyce Don Tom Christine Rachel Jeff Raymond Kelli"
            + " Charles Kevin Brant Joseph Michael Kelly Jessie Suzie Sally"
            + " Christian Terry John Art Francis Riki Evelyn Tony Ikaika Joe"
            + " Ann Neil Daniel Willie James Jeremy Aislynn Larry Celeste"
            + " Paige Dennis Fred Rosa Ryan George Gabe Lance Carolyn Mariah"
            + " Hal Christina Christopher Mark Stephen Stanley Sharon Hannah"
            + " Gregory Barry Kawika Greg Derek Philip Alfredo Jillian Joedie"
            + " Anthony Kyle Bradley Masa Clyde Robert Zachary Jaron Fernando"
            + " Kosuke Becky Dora Rheada Ashley Dustin Joshuah Ricardo Pete"
            + " Katrina Arwin Mica Arlene Venus Jenny Nicole Jeylyn Trisha"
            + " Theresa Eric Terry Trenton Marcus Tristan Rueben Melvin"
            + " Kurtis Mary";
    //Use name for names and nameLength for number of names
    String[] nameData = namesList.split("\\s");
    boolean[] nameInsert = new boolean[nameData.length];
    for (String dataAdd : nameData) {
        bst.insertLeft(dataAdd, null);

    }
    System.out.println("\nThe Oshiro NamesList has been added to the tree, printing tree:");
    bst.traverse(1);
    System.out.println(bst.toString());

    Scanner userInput = new Scanner(System.in);
    System.out.println("Options available:"
            + "\n[0]Add the names to the tree"
            + "\n[1]Delete a name from the tree"
            + "\n[2]Print out contents of tree in alphabetical order"
            + "\n[3]Print out contents of tree in reverse alphabetical order"
            + "\n[4]Search the tree for a specific name and return number of probes"
            + "\n[5]Destroy the tree"
            + "\n[6]Balance the tree"
            + "\n[7]Draw the tree as loaded"
            + "\n[8]Draw the tree completely balanced"
            + "\n[9]Draw the tree"
            + "\n[10]Exit");
    int selection;

共有1个答案

凤经武
2023-03-14

树是向左生长的,因为这是您在代码中告诉它的

for(String dataAdd : nameData)
    bst.insertLeft(dataAdd, null);

insertleft顾名思义,只在左侧插入,将树更像是一个链表

public void insertLeft(E key, T value)
{
    Node<E, T> node = new Node<E, T>(key, value);
    if(root == null)
        root = node;
    else
    {
        Node current = root;
        while(current.left != null)
            current = current.left;
        current.left = node;
    }
}

code>insertleft方法的结构工作良好,在遍历树以添加到左侧之前,检查树是否为空(root==null)的基本情况

如果您希望它作为已排序树(二进制搜索树)的insert工作,您可能希望对它进行一点编辑以考虑排序顺序

public void insertSorted(E key, T value)
{
    Node<E, T> node = new Node<E, T>(key, value);
    if(root == null) //keep the same base case
        root = node;
    else
    {
        Node current = root;
        while(true)
            if(node < current) //check left
                if(current.left == null) //set left
                {
                    current.left = node;
                    break;
                }
                else //iterate over left
                    current = current.left;
            else //check right
                if(current.right == null) //set right
                {
                    current.right = node;
                    break;
                }
                else //iterate over right
                    current = current.right;
    }
}

请注意,对于要在调用insertsorted后排序的树,必须已经对该树进行了排序

还要注意,空树将被排序,只有1个节点的树也是如此

 类似资料:
  • 我有一个Java中的二叉搜索树作业,其中给了我完整的树和节点类,还有一个SearchTree类,我要在其中完成搜索和插入方法。搜索应该返回对应于所搜索键的节点的值。 这里是树类,这里是节点类。我的搜索和插入方法如下。 看来我已经接近了,但是将键0和值2插入树[node[0,1,null,null]]的测试结果是树[node[0,1,null,null]]而不是正确的树[node[0,2,null,

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

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

  • 我目前正在学习使用java的树,在二叉树中插入项时出现了一些错误,我不知道为什么它不起作用 这是代码:树节点: 树类: 每当我添加一个项目,根仍然为空,没有右或左的项目,如果有人能帮助我,我会非常感激

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

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