我正在实现一个二进制搜索树 Java
. 然而,我的 search
函数在remove函数中似乎工作不正常。总是找不到 Nodes
在树里面,不管它们是否真的在树里面。我认为我的逻辑是正确的,比较节点左右移动取决于 Node
搜索的范围是大还是小,但我在搜索时可能会遇到一些问题 return
价值观。如果添加node类或程序测试会有所帮助,我可以这样做。有什么建议吗?
public class BinarySearchTree {
private boolean empty = true;
private int size = 0;
private Node root;
public BinarySearchTree(Node root)
{
this.root = root;
}
public Node[] search(int value)
{
Node parent = null;
Node currentNode = root;
Node[] returnList = new Node[2];
while ( currentNode != null )
{
if (currentNode.getValue() == value)
{
returnList[0] = parent;
returnList[1] = currentNode;
return returnList;
}
else if (value < currentNode.getValue())
{
parent = currentNode;
currentNode = currentNode.getLeft();
}
else if (value > currentNode.getValue())
{
parent = currentNode;
currentNode = currentNode.getRight();
}
}
return returnList;
}
public void add(int value)
{
Node comparingNode = root;
while (true)
{
if (comparingNode.getValue() == value)
{
System.out.println("Tried to add duplicate value of " + value);
break;
}
if (comparingNode.getLeft() == null && comparingNode.getRight() == null)
{
if (value > comparingNode.getValue())
{
comparingNode.setRight(new Node(value));
}
if (value < comparingNode.getValue())
{
comparingNode.setLeft(new Node(value));
}
break;
}
else
{
if (value < comparingNode.getValue())
{
if (comparingNode.getLeft() == null)
{
comparingNode.setLeft(new Node(value));
break;
}
else
{
comparingNode = comparingNode.getLeft();
}
}
if (value > comparingNode.getValue())
{
if (comparingNode.getRight() == null)
{
comparingNode.setRight(new Node(value));
break;
}
else
{
comparingNode = comparingNode.getRight();
}
}
}
}
}
public void remove(int value)
{
Node[] nodesFound = search( value );
Node parent = nodesFound[0];
Node child = nodesFound[1];
boolean fLeft = ( parent.getLeft() == child );
// child node has no children.
if (fLeft)
{
parent.setLeft(null);
}
else
{
parent.setRight(null);
}
if( child.getLeft() != null && child.getRight() == null )
{
// child node has only left child.
if( fLeft )
{
parent.setLeft(child.getLeft());
}
else
{
parent.setRight(child.getLeft());
}
}
else if ( child.getRight() != null && child.getLeft() == null )
{
// child node has only right child.
if( fLeft )
{
parent.setLeft(child.getRight());
}
else
{
parent.setRight(child.getRight());
}
}
else
{
// child node has both children.
if( child.getRight().getLeft() == null )
{
child.getRight().setLeft( child.getLeft() );
parent.setRight( child.getRight() );
}
else
{
Node[] returnList = findLeftMost2Children(child.getRight());
Node leftMostParent = returnList[0];
Node leftMostChild = returnList[1];
leftMostParent.setLeft(null);
leftMostChild.setLeft(child.getLeft());
leftMostChild.setRight(child.getRight());
parent.setRight(leftMostChild);
}
}
}
public Node getRoot()
{
return root;
}
public void outputTreeInOrder( Node root )
{
if( root == null )
return;
// Output the left tree.
if( root.getLeft() != null )
outputTreeInOrder( root.getLeft() );
// Output the current node.
System.out.print( root.getValue() + " " );
// Output the right tree.
if( root.getRight() != null )
outputTreeInOrder( root.getRight() );
}
private Node[] findLeftMost2Children( Node root )
{
Node parent = null;
Node current = root;
while (current.getLeft() != null)
{
parent = current;
current = current.getLeft();
}
Node[] returnList = new Node[2];
returnList[0] = parent;
returnList[1] = current;
return returnList;
}
}
1条答案
按热度按时间vddsk6oq1#
我用密码纠正了这个问题。我意识到在删除节点时必须设置适当的指针来移动节点,而不仅仅是更改值。你必须移动
node
用新的pointers
为了它和它的parent
.