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

BST插入(根,值)递归方法

端木志诚
2023-03-14

编辑:我想出来了——放弃了这个设计,重新开始,它成功了!谢谢你的建议。

我正在做一个BST算法的家庭作业,我绝望地被困在插入方法上。我在网上找到的所有资源都有一个与我创建的版本相似的版本,但是我没有通过教授给我们的JUnit测试。我可以通过基本情况(root.payload==value的空根和二叉树)。不过,我似乎无法通过下一个测试。这是我的插入(root, value)方法代码:

public static Node<Integer> insert(Node<Integer> root, Integer value) {
    if (root == null) {
        root = new Node<>(value);
    } else if (root.payload.equals(value)) {
        return root;
    } else if (value < root.payload) {
        return root.left = insert(root.left, value);
    } else {
        return root.right = insert(root.right, value);
    }
    return root;
}

最终返回的是原始的根节点,但根据我的理解,最后返回的值应该是我的新节点。我看了我的教科书和一些在线资源,它们都有与此设计非常相似的东西,所以我很困惑为什么它不起作用。我尝试了一些其他设计,但它们最终都是NullPointerException。给我们的JUnit测试验证我们是否将节点插入了正确的位置,此外还检查了Node的有效负载。我没有通过这两个测试。这是我们第一次使用递归的作业,所以我在这方面还是相当新手。如果有任何指导,将不胜感激!

共有2个答案

桓智敏
2023-03-14
public static Node<Integer> insert(Node<Integer> root, Integer value) {
    if (root == null) {
        root = new Node<>(value);
    } else if (value < root.payload) {
         root.left = insert(root.left, value);
    } else if (value > root.payload) {
         root.right = insert(root.right, value);
    }
    return root;
}

这将在正确的位置添加值并返回根。您可以打印树以检查是否相同

杨腾
2023-03-14

如果您希望方法中返回的值是新插入的节点,您还必须在elseIF子句中添加返回语句,以便在递归堆栈展开时返回新创建的节点。检查下面的代码

public static Node<Integer> insert(Node<Integer> root, Integer value) {
if (root == null) {
    root = new Node<>(value);
} else if (value <= root.payload) {
    return root.left = insert(root.left, value);   // add a return here
} else {
   return  root.right = insert(root.right, value);  // add a return here
}
return root;

}

 类似资料:
  • 我编写了以下代码来实现BST的递归插入方法。但是当我以遍历顺序打印树时,它会在插入之前打印原始树。似乎没有插入元素。请帮帮我。提前谢谢。另外,请建议更改代码。顺便说一下,初始树的遍历顺序是2 5 6 7 8。

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

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

  • 当您可以调用递归方法而不是必须将递归方法设置为变量时,是否有一种简单的方法来理解? 例如... 只是调用递归函数遍历: self.recurse(node.left) self.recurse(node.right) 必须将递归函数设置为node。左和右。右: 节点。左=自我。递归(node.left) 节点。右=自我。递归(node.left) 另一个例子是删除bst中的一个节点,你必须将递归函

  • 通常我们主要称之为insert,比如

  • 我写了一个到达基本情况的方法(我可以告诉你,因为它打印了print语句),但是它会循环返回null(在方法的结尾)。为什么我的方法没有在基本情况下停止? 编辑:此外,如果一个对象不存在于我的BST中,它不会返回null。我得到了一个空指针异常,这是不应该发生的,因为或语句