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

BST只保留上次插入的值并使其为根

景才英
2023-03-14
public class BinarySearchTree<T extends Comparable<T>> {

private class BinarySearchTreeNode<E>{
    public BinarySearchTreeNode<E> left, right;
    private E data;

    private BinarySearchTreeNode (E data) {
        this.data = data;
    }
}

private BinarySearchTreeNode<T> root;

public boolean isEmpty() {
    return root == null;
} 
private BinarySearchTreeNode<T> insert(T value, BinarySearchTreeNode<T> ptr) {
            if (ptr == null){ 
        ptr = new BinarySearchTreeNode<>(value); 
        return ptr; 
    }
    int compare = value.compareTo(ptr.data); //when ptr != null, this line and below should execute for each bstStrings.inster(x)
    /* pass the value (s1...sN) when compared to (ptr.data) to compare
     * when value and ptr.data == 0 re
     */
    if (compare == 0) {
        return ptr;
    }
    if (compare < 0) {
        while (ptr.left != null){
            ptr = ptr.left;
            if (ptr.left == null) {//found insertion point
                BinarySearchTreeNode<T> node = new BinarySearchTreeNode<>(value);
                ptr = ptr.left;
                ptr = node;
                return ptr;
            }
        }
    }
    else {
        return insert(value, ptr.left);
    }
    if (compare > 0) {              
        if (ptr.right == null) {
            BinarySearchTreeNode<T> node = new BinarySearchTreeNode<>(value);
            ptr = ptr.right;
            ptr = node;
            return ptr;
        } 
    }
    else {
        return insert(value, ptr.right);                    
    }
    return ptr;
}
public void insert(T value) {
    root = insert(value, root);  //****Where I believe the problem is******
} 
private void printTree(BinarySearchTreeNode<T>node){
    if(node != null){
        printTree(node.left);
        System.out.println(" " + node.data);
        printTree(node.right);
    }
}
public void printTree(){
    printTree(root);
    System.out.println();
}    
}

对于添加的上下文,这里是Main(),我在这里调用insert()并尝试将字符串插入到BST中:

public class Main {

public static void main(String[] args) {

    BinarySearchTree<String> bstStrings = new BinarySearchTree<String>();

    String s = "Hello";
    String s1 = "World";
    String s2 = "This Morning";
    String s3 = "It's";

    bstStrings.insert(s);
    bstStrings.insert(s1);
    bstStrings.insert(s2);
    bstStrings.insert(s3);   //the only inserted value that is printed below

    bstStrings.printTree();

        System.out.println();
        System.out.println("You should have values above this line!");
}
}

最后,我的控制台输出:

It's


You should have values above this line!

共有1个答案

诸经略
2023-03-14

一些暗示:

  • insert中没有看到任何递归调用。如果没有适当的递归调用(根据值进入当前节点的左或右子树),您将如何遍历BST?我确实看到一些注释掉的代码,看起来可以执行这些调用。为什么它们被注释掉了?
  • 返回新插入的节点,然后将其设置为root。这将设置每次指向新节点。我不认为这是你想要的。
  • 如果要处理树为空的特殊情况,所需做的就是检查root是否为null,然后将新节点设置为null。
  • 确实不需要返回PTR。由于BST维护对root的引用,所以始终有对树的根的引用。每次插入时,从开始,然后递归遍历树,直到找到合适的位置插入新节点。如果您确实必须返回引用,那么您当然不应该将root设置为新节点!

下面是一些伪代码来帮助您:

// Recursive function that inserts a value into a BST
function insert(node, value):

    //Handles the case where you have no nodes in the tree, so root is null
    if node is null:
        node = new Node(value)

    // If the value is lesser than the current node's value, we need to insert it
    // somewhere in the right subtree
    else if value < node.value:
        if node.right is null:
           // This node doesn't have a right child, so let's insert the new node here
           node.right = new Node(value)
        else:
           // This node has a right child, so let's go further into this subtree to
           // find the right place to insert the new node
           insert(node.right, value)

    // If the value is greater than the current node's value, we need to insert it
    // somewhere in the left subtree
    else if value > node.value:
        if node.left is null:
           // This node doesn't have a left child, so let's insert the new node here
           node.left = new Node(value)
        else:
           // This node has a left child, so let's go further into this subtree to 
           // find the right place to insert the new node
           insert(node.left, value)
    else:
        // A node with this value already exists so let's print out an erro
        error("Node with that value already exists")

end function
 类似资料:
  • 我创建了一个二叉查找树类。我创建了我的插入方法、高度方法和打印方法。当我插入时,一切看起来都很好。如果根为空,我创建一个新的根并设置该项目。但是当我调用我的高度方法时,它打印出2而不是1。当我调用print方法时,它会两次打印出包括root在内的所有元素。例如,我按以下顺序插入了以下元素:9, 5, 4, 55, 555 当我调用PREorderPRINT方法时,它会输出:9, 5, 4, 9,

  • 编辑:我想出来了——放弃了这个设计,重新开始,它成功了!谢谢你的建议。 我正在做一个BST算法的家庭作业,我绝望地被困在插入方法上。我在网上找到的所有资源都有一个与我创建的版本相似的版本,但是我没有通过教授给我们的JUnit测试。我可以通过基本情况(root.payload==value的空根和二叉树)。不过,我似乎无法通过下一个测试。这是我的插入(root, value)方法代码: 最终返回的是

  • 谁能帮我创建一个触发器,将Sensordata表中的最后一条记录附加到lastssensordata中。我只希望每个ConnectionDeviceId有1个值,并且该值必须是最后插入的值。(它将用于在仪表中显示)。我将在下链接我的sql脚本。

  • 我有下表和Postgres: 作为select查询的一部分,我希望能够基于最高的Col2值(每个Col1值永远不会有多个最高值)在Col1中删除重复项,并保留相应的Col2、Col3值。 期望输出:

  • 我试图插入二叉查找树使用递归,然后打印它预先使用这个特定的代码,但我只有根作为输出,为什么?这是因为每个时间栈(每次调用后)弹出从而删除新节点?这是一个java代码)

  • PS:我知道O(n^2),但这对我来说不是问题。