我有一个项目,我必须在其中创建一个bst。所以我的问题是我必须创建一个布尔方法,在其中检查节点是否是他父亲的右/左子节点。
public class TreeNode
{
private int data;
private TreeNode right;
private TreeNode left;
private TreeNode parent;
**assesor and mutator methods**
public TreeNode (int data)
{
this.data = data;
right = null;
left = null;
}
public boolean isRightChild (TreeNode parent)
{
if (parent.right.data == data)
{
return true;
}
return false;
}
public boolean isLeftChild (TreeNode parent)
{
if (parent.left.data == data)
{
return true;
}
return false;
}
}
我在另一个类中使用this ...
调用此方法node2.isRightChild(parent)
或
node2.isLeftChild(parent)
在编译器中它向我显示NullPointerException 插入方法(在另一个类中)是......
public void insert(int data)
{
TreeNode element = new TreeNode (data);
if (node == null)
{
node = element;
return;
}
TreeNode node2 = node;
TreeNode parent = null;
while(true)
{
parent = node2;
if (data < node2.getData())
{
node2 = node2.getLeft();
if (node2 == null)
{
parent.setLeft(element);
return;
}
}else
{
node2 = node2.getRight();
if(node2 == null)
{
parent.setRight(element);
return;
}
}
}
}
更新:我的删除方法如下......
public boolean remove(int data)
{
TreeNode parent = node;
TreeNode node2 = node;
//searching through the nodes
while(node2.getData() != data)
{
parent = node2;
if(node2.getData() > data)
{
node2 = node2.getLeft();
}else
{
node2 = node2.getRight();
}
}
//empty node
if (node == null)
{
return false;
}
//leaf
if(node2.isLeaf(data))
{
if(node2 == node)
{
node = null;
}
if(node2.isRightChild(parent))
{
parent.setRight(null);
}else
{
parent.setLeft(null);
}
}
//node with 1 child
else if((node2.getLeft() == null))
{
if (node2 == node)
{
node = node2.getRight();
}else if(parent.isRightChild(node2))
{
parent.setRight(null);
}else
{
parent.setLeft(null);
}
}
else if((node2.getRight() == null))
{
if(node2 == node)
{
node = node2.getLeft();
}else if (node2.isLeftChild(parent))
{
parent.setLeft(null);
}else
{
parent.setLeft(null);
}
}
//node with 2 children
else if ((node2.getLeft() != null) && (node2.getRight() !=null))
{
TreeNode min = minFromRightSide(node2);
if(node2 == node)
{
node = min;
}else if(node2.isLeftChild(parent))
{
parent.setLeft(min);
}else
{
parent.setRight(min);
}
min.setLeft(node2.getLeft());
}
return true;
}
所以完成问题的是,使用这个remove方法,当节点有一个子节点而不是删除1个节点时,它会删除这个节点和他的孩子...所以当我试图删除子节点后,我显然有NullPointerException
答案 0 :(得分:0)
您检查错误。抛出NullPointerException,因为当没有左或右子时,它指向什么。
试试这个
public boolean isRightChild (TreeNode parent)
{
if (parent.right != null) //checks if a right child exists
{
return true;
}
remove(parent);
return false;
}
public boolean isLeftChild (TreeNode parent)
{
if (parent.left != null) //checks if a left child exists
{
return true;
}
remove(parent);
return false;
}
<强>更新强> 如果你想在这里删除节点是一种可以做到这一点的方法。 (我将它用于我的BST)
private void remove(Node node)
{
E theData;
Node parent, replacement;
parent = findParent(node);
if ((node.left != null) && (node.right != null))
{
replacement = node.right;
while (replacement.left != null)
replacement = replacement.left;
theData = replacement.data;
remove(replacement);
node.data = theData;
}
else
{
if ((node.left == null) && (node.right == null))
replacement = null;
else if (node.left == null)
replacement = node.right;
else
replacement = node.left;
if (parent==null)
root = replacement;
else if (parent.left == node)
parent.left = replacement;
else
parent.right = replacement;
}
}