添加元素二叉搜索树

时间:2013-11-11 18:43:35

标签: java

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

到目前为止我所拥有的:

public void addElement(E elem, Node<E> root) {

创建值为elem的节点,将其命名为newNode

案例1:树是空的

root = newNode();
return; //End of method.

否则,继续搜索树(通过比较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
}
  }

}

请原谅我,如果这是一个重复/模糊的问题,这是我关于SO的第一篇文章,我有点像菜鸟。

1 个答案:

答案 0 :(得分:0)

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());
    }
}

您不应该更改类的根,只是将其传递给下一个方法调用。这应该保留根。

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