这是一个相对较大的项目,但我会尝试将所有必要的东西放在这里。
/** Removes the record with Key k from the dictionary. It throws a
DictionaryException if the record is not in the dictionary. */
public void remove(Key k) throws DictionaryException{
deleteNode = findNode(k);
if (deleteNode == null) throw new DictionaryException("Error: Record doesn't exist in the dictionary!");
else{
//check if children are leafs
if(deleteNode.getLeftChild() == null || deleteNode.getRightChild() == null)
//set it to itself
replace = deleteNode;
else
//otherwise replace with successorNode
replace = successorNode(deleteNode);
//store left child if it exists
if (replace.getLeftChild() != null)
child = replace.getLeftChild();
//else, store right
else
child = replace.getRightChild();
//check if both nodes are null
if (child != null)
child.setParent(replace.getParent());
//else replace the node that needs to be deleted
else{
//replace left child of parent
if(replace == replace.getParent().getLeftChild())
replace.getParent().setLeftChild(child);
//else replace right
else
replace.getParent().setRightChild(child);
}
//store information of the replacing node, within the deleteNode
if (replace != deleteNode)
deleteNode.setRoot(replace.getRecord());
}
}
此方法在父内容上有空指针错误。 我不知道如何处理它。
这是存储在BST中的有序词典。节点由记录组成,记录由(密钥,数据)组成,其中密钥是(名称,类型)。基本上记录是((名称,类型),数据)。
如有必要,我可以提供更多信息。我被困在这里很长一段时间,任何帮助都表示赞赏!
答案 0 :(得分:0)
TreeBstNode :数据结构
删除:删除方法
public class TreeBst {
/**
* The Class TreeBstNode.
*/
private class TreeBstNode {
/** The data. */
int data;
/** The l child. */
TreeBstNode lChild;
/** The r child. */
TreeBstNode rChild;
/** The parent. */
TreeBstNode parent;
/**
* Instantiates a new tree node.
*/
TreeBstNode() {
this(0, null, null, null);
}
/**
* Instantiates a new tree node.
*
* @param data
* the data
* @param rChild
* the r child
* @param lChild
* the l child
* @param parent
* the parent
*/
/**
* @param data
* @param rChild
* @param lChild
* @param parent
*/
TreeBstNode(int data, TreeBstNode rChild, TreeBstNode lChild,
TreeBstNode parent) {
this.data = data;
this.rChild = rChild;
this.lChild = lChild;
this.parent = parent;
}
}
/** The root. */
private TreeBstNode root;
/**
* Instantiates a new tree bst.
*/
public TreeBst() {
root = null;
}
/**
* Instantiates a new tree bst.
*
* @param x
* the x
*/
public TreeBst(int x) {
root = new TreeBstNode(x, null, null, null);
}
/**
* Delete.
*
* @param x
* the x
* @return the tree node
*/
public TreeBstNode delete(int x) {
return BST_Delete(root, x);
}
/**
* BS t_ delete.
*
* @param t
* the t
* @param x
* the x
* @return the tree node
*/
private TreeBstNode BST_Delete(TreeBstNode t, int x) {
// TODO Auto-generated method stub
if (t == null) {
return null;
} else if (x < t.data) {
BST_Delete(t.lChild, x);
} else if (x > t.data) {
BST_Delete(t.rChild, x);
} else {
return BST_DeleteItem(t);
}
return null;
}
/**
* BS t_ delete item.
*
* @param t
* the t
* @return the tree node
*/
private TreeBstNode BST_DeleteItem(TreeBstNode t) {
// TODO Auto-generated method stub
TreeBstNode temp = t;
TreeBstNode returnTree = null;
if (t.lChild == null && t.rChild == null) {
if (t.parent != null) {
if (t.parent.lChild == t) {
returnTree = t.parent.lChild;
t.parent.lChild = null;
} else {
returnTree = t.parent.rChild;
t.parent.rChild = null;
}
} else {
returnTree = root;
root = null;
}
} else if (t.lChild == null) {
t = t.rChild;
} else if (t.rChild == null) {
t = t.lChild;
} else {
temp = t.lChild;
while (t.rChild != null) {
temp = temp.rChild;
}
t.data = temp.data;
BST_Delete(t.lChild, temp.data);
}
return returnTree;
}