尝试向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的第一篇文章,我有点像菜鸟。
答案 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
在某个地方或某些类似的地方?