【问题标题】:recursion method in binary search tree-java二叉搜索树-java中的递归方法
【发布时间】:2014-10-30 13:19:23
【问题描述】:

我正在尝试编写一个将值插入二叉搜索树的布尔递归方法。如果该值不存在,则返回 true 并将其插入,如果那里已经存在相同的值并且列表未更改,则返回 false。我认为这在大多数情况下都有效,但是当多个值已经存在时,它无法重复返回 false。例如,如果树已经包含 3 9 6 7 并且我尝试插入 3,它会返回 false,因为这是第一次。但是当我尝试插入 9 6 或 7 时,它总是返回 true,它不应该因为这些值已经存在。

public boolean insert(int value) {
    Node travel;
    travel=insert(value,root);
    if (travel==null)
        return false;
    root=travel;
    return true;
}

private Node insert(int value, Node travel) {
    if (travel==null) {
        travel=new Node(value);
        return travel;  
    }
    if (value>travel.data) {
        travel.right=(insert(value,travel.right));
        return travel;
    }
    if(value<travel.data) {
        travel.left=(insert(value,travel.left));
        return travel;
    }
    return null;
}

【问题讨论】:

  • 代码本身看起来不错 Lori。您的树可能在第一次插入后有孤立节点,导致以后的插入返回 true。
  • @algorithmic 代码错误。假设树包含根为 3 的 3 6 9 7。当您尝试插入 6 时,如果大小写匹配,则第二个。递归调用 insert 会将 3 的右后代设置为某个值。但返回的是值为 3 的节点。
  • @User - 在第一次调用 insert(value,travel) 时,匹配第二种情况。在这种情况下,调用 insert(value, travel.right),现在返回 null。这就是从递归中出来时 travel.right 将被设置的内容。并且返回旅行将返回null。所以它确实可以正常工作,在第一个插入案例中。但是实际上并未显示插入代码。因此,不清楚第二个插入案例发生了什么变化 - 即调用 insert(9) 时。
  • @algorithmic travel 不能为空。如果它为空,则第一种情况将匹配您的意思是不显示插入代码?!它是一个递归调用,所以一切都显示出来了。
  • @user - 未显示实际插入到树中。如果这是唯一的代码并且树是预先构建的,则代码没有问题。你是什​​么意思旅行不能为空?如果该值既不大也不小,则达到最后一个返回“return null”。

标签: java recursion binary-search-tree


【解决方案1】:

改成这样:

private Node insert(int value, Node current) {
    if(current.data == value){
        return current;
    }else if(current.left != null && current.left.data > value){
        return insert(value,current.left);
    }else if(current.right != null && current.right.data < value){
        return insert(value,current.right);
    }else{
        if(current.data > value){
            current.left = new Node(value);
        }else{
            current.right = new Node(value);
        }
        return null;
    }
}

这将插入具有给定值的节点,如果它不存在并返回 null。否则将返回一个节点,表明该节点已经存在。

【讨论】:

    【解决方案2】:

    我觉得可能是这样的

    初始调用insert(value, root, null)

    public boolean insert(int value, Node currentNode, Node parentNode) {
        if(currentNode == null) { //Node not present, hence insert
             Node valueNode = new Node(value);
             if(parentNode != null && parentNode.value > value) { //link to the parent node
                 parentNode.left = valueNode;
             } else if(parentNode != null && parentNode.value < value){
                 parentNode.right = valueNode;
             }
             return true; 
        } else if(currentNode.value = value) { //Node present 
             return false;
        } else if(value > currentNode.value) { //Now check the same in right side of the tree
             return insert(value, currentNode.right, currentNode);
        } else if(value < currentNode.value) { //Now check the left side of the tree
             return insert(value, currentNode.left, currentNode);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 2017-03-25
      • 2014-01-02
      • 2021-09-01
      • 2013-07-20
      相关资源
      最近更新 更多