Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二叉搜索树加法算法的实现_Java_Algorithm_Data Structures_Binary Tree_Binary Search Tree - Fatal编程技术网

Java 二叉搜索树加法算法的实现

Java 二叉搜索树加法算法的实现,java,algorithm,data-structures,binary-tree,binary-search-tree,Java,Algorithm,Data Structures,Binary Tree,Binary Search Tree,我必须在java中为BST实现一个add方法,但无法让add函数工作。有人能帮我吗 private boolean add(E x, BinaryNode<E> currentNode){ if (currentNode == null){ currentNode = new BinaryNode<>(x); size++; return true; }

我必须在java中为BST实现一个add方法,但无法让add函数工作。有人能帮我吗

private boolean add(E x, BinaryNode<E> currentNode){

        if (currentNode == null){
            currentNode = new BinaryNode<>(x);
            size++;
            return true;
        }

        if (currentNode.element.compareTo(x) == 0){
            return false;
        }

        else if((currentNode.element.compareTo(x) < 0)){

            if(currentNode.left == null){
                currentNode.left = new BinaryNode<>(x);
                size++;
                return true;

            } else {
                add(x, currentNode.left);
            }

        }

        else if(currentNode.element.compareTo(x) > 0){

            if(currentNode.right == null){
                currentNode.right = new BinaryNode<>(x);
                size++;
                return true;

            } else {
                add(x, currentNode.right);
            }

        }

        return false;
    }

    public boolean add(E x){
        return this.add(x, root);
    }
private boolean add(ex,二进制节点currentNode){
if(currentNode==null){
currentNode=新的二进制节点(x);
大小++;
返回true;
}
if(currentNode.element.compareTo(x)==0){
返回false;
}
else if((currentNode.element.compareTo(x)<0)){
if(currentNode.left==null){
currentNode.left=新的二进制节点(x);
大小++;
返回true;
}否则{
添加(x,currentNode.left);
}
}
else if(currentNode.element.compareTo(x)>0){
if(currentNode.right==null){
currentNode.right=新的二进制节点(x);
大小++;
返回true;
}否则{
添加(x,currentNode.right);
}
}
返回false;
}
公共布尔加法(E x){
返回这个。添加(x,根);
}

我看到的一个问题是,当您分配根元素时,您将其分配给一个局部变量。这显然行不通

private boolean add(E x, BinaryNode<E> currentNode){
  /////// REMOVE
        if (currentNode == null){
            currentNode = new BinaryNode<>(x);
            size++;
            return true;
        }
  ///////
private boolean add(ex,二进制节点currentNode){
///////除去
if(currentNode==null){
currentNode=新的二进制节点(x);
大小++;
返回true;
}
///////
再加上这个

public boolean add(E x){
    if( root == null ) {
      root = new BinaryNode<>(x);
      size++;
      return true;
    }  else
      return this.add(x, root);
}
公共布尔加法(ex){
if(root==null){
root=新的二进制节点(x);
大小++;
返回true;
}否则
返回这个。添加(x,根);
}

基本上,子树的根可能会改变,这是一个递归,为了使它工作,返回值应该是子树的新根,不管它是否改变

以下是Java中取自我的BST impl的add()方法,该方法通过了所有测试用例:

/**
 * Add a new value.
 *
 * @param v
 */
@Override
public void add(T v) {
    root = add(root, v);
}

/**
 * Add to a subtree start from given node.
 *
 * @param current root of a subtree to add node to,
 * @param v
 * @return the new root of subtree,
 */
protected BSTNode<T> add(BSTNode<T> current, T v) {
    if (current == null) { // subtree is empty,
        size++;
        return new BSTNode<>(v);
    }

    // compare,
    int compareFlag = v.compareTo(current.value);

    // check this or subtree,
    if (compareFlag < 0) { // smaller, go to left subtree,
        current.left = add(current.left, v);
    } else if (compareFlag > 0) { // larger, go to right subtree,
        current.right = add(current.right, v);
    } else { // equals, ignore it,
    }

    return current;
}
/**
*添加一个新值。
*
*@param v
*/
@凌驾
公共空间添加(电视){
根=加(根,v);
}
/**
*从给定节点开始添加到子树。
*
*@param要添加节点的子树的当前根,
*@param v
*@返回子树的新根,
*/
受保护的BSTNode添加(BSTNode当前,T v){
如果(current==null){//子树为空,
大小++;
返回新节点(v);
}
//比较,,
int compareFlag=v.compareTo(当前值);
//选中此树或子树,
如果(compareFlag<0){//更小,则转到左子树,
current.left=add(current.left,v);
}否则,如果(compareFlag>0){//更大,则转到右子树,
current.right=add(current.right,v);
}否则{//equals,忽略它,
}
回流;
}

现在调用
add()
时有什么问题?无论我调用函数多少次,它作为currentNode始终为null,因此它只进入第一个if语句