Java 在二叉搜索树中添加元素

Java 在二叉搜索树中添加元素,java,Java,试图向BST添加一个元素。我知道如何做,但我的实现是破坏性的,并且原始根没有保留(因此树基本上变得无用)。树基于列表,此方法基于递归。我真正的问题是保留原始根。我用的是泛型 到目前为止,我有: public void addElement(E elem, Node<E> root) { 否则,继续搜索树(通过将out节点a的值与树的根进行比较) if (!root.hasLeft() && !root.hasRight) { //if the root in que

试图向BST添加一个元素。我知道如何做,但我的实现是破坏性的,并且原始根没有保留(因此树基本上变得无用)。树基于列表,此方法基于递归。我真正的问题是保留原始根。我用的是泛型

到目前为止,我有:

public void addElement(E elem, Node<E> root) {
否则,继续搜索树(通过将out节点a的值与树的根进行比较)

if (!root.hasLeft() && !root.hasRight) { //if the root in question has no children
    if (elem < rootValue) {     //Set the element as the left element
      root.setLeft(newNode);
    }
    else {                      //Set the element as the right element.
      root.setRight(newNode);
    }
  } 

  else {

    if (E < root.getElem()) {              
//This is where the value of our node is compared to the value of the root, which we passed in.
//(I know that we can't use the < and > operators with generics, but assume it works).

  root = root.getLeft() //Left node is new root
  addElement(elem, root); //Call the method again
}
else {  
  root = root.getRight(); //Right node is new root
  addElement(elem, root)  //Call method again
}
  }
if(!root.hasleet()&&&!root.haslright){//如果所讨论的根没有子级
如果(elem运算符与泛型一起使用,但假设它可以工作)。
root=root.getLeft()//左节点是新根
addElement(elem,root);//再次调用该方法
}
否则{
root=root.getRight();//右节点是新根
addElement(elem,root)//再次调用方法
}
}
}

如果这是一个重复的/模糊的问题,请原谅我,这是我第一次发表这样的帖子,我有点不知所措

if (!root.hasLeft() && !root.hasRight) {
这种逻辑是错误的。如果您既没有左子级也没有右子级,那么您只考虑“设置”左子级。此更改应该可以做到:

void addElement(elem, root)
{
    if (elem < root.value) {  
      if(!root.hasLeft())
          root.setLeft(newNode);
      else
          addElement(elem, root.getLeft());
    }
    else {    
      if(!root.hasRight())   
          root.setRight(newNode);
      else             
          addElement(elem, root.getRight());
    }
}
void addElement(元素,根)
{
if(elem
您不应该更改类的根,而应该将其传递到下一个方法调用中。这应该保留根


顺便说一句,我假设你有
rootValue=root.value
某个地方或类似的东西?

你能展示一下你的
setLeft
setRight
的实现吗?这个算法现在是错误的。他只在没有子项的情况下设置子项。但在某些情况下,当你只有一个子项时,你还想将它设置为o另一个
void addElement(elem, root)
{
    if (elem < root.value) {  
      if(!root.hasLeft())
          root.setLeft(newNode);
      else
          addElement(elem, root.getLeft());
    }
    else {    
      if(!root.hasRight())   
          root.setRight(newNode);
      else             
          addElement(elem, root.getRight());
    }
}