所以我得到了一个用Java创建BST的任务,到目前为止它一切顺利。但是我对remove方法有疑问。正如我已经实现的那样,如果我删除节点X,那么节点X的所有子树也将被删除。我只是想知道这是一个常见的实现,还是我应该重新排列节点,如果我删除一个?我也是从这个类中创建一个AVL树,所以我需要一个trinodeRestructering方法。我想这需要一些修改,如果我进去和删除节点?
Thiis是我的删除方法的工作原理:
private TreeNode remove(TreeNode currN, int dataToRemove) {
if (dataToRemove < currN.getData()) {
if (currN.getLeft() != null) {
if (currN.getLeft().getData() == dataToRemove) {
currN.setLeft(null);
} else {
remove(currN.getLeft(), dataToRemove);
}
}
} else if (dataToRemove > currN.getData()) {
if (currN.getRight() != null) {
if (currN.getRight().getData() == dataToRemove) {
currN.setRight(null);
} else {
remove(currN.getRight(), dataToRemove);
}
}
}
return currN;
}
//visual representation
/--------85
/--------25
/--------20
10
********************************************************************
*******removed 20******
10
*******************************************************************
为帖子添加了树:
/--------85
/--------25
\--------24
/--------20
| /--------13
\--------12
| \--------11
10(root)
这是我尝试的一些交换,它看起来很糟糕,难以阅读代码:
if (dataToRemove < currN.getData()) {
if (currN.getLeft() != null) {
if (currN.getLeft().getData() == dataToRemove) {
//Om inga barn, sätt noden till null.
if(currN.getLeft().getLeft() == null && currN.getLeft().getRight() == null){
currN.setLeft(null);
}//Om noden enbart har höger barn
else if(currN.getLeft().getLeft() == null){
TreeNode old = currN.getLeft().getRight();// Gamla höger
currN.setLeft(currN.getLeft().getLeft()); //
currN.getLeft().getRight().setRight((old)); //
}//Om noden enbart har vänster barn.
else if(currN.getLeft().getRight() == null){
TreeNode old = currN.getLeft().getRight();// Gamla vänster
currN.setLeft(currN.getLeft().getLeft()); //
currN.getLeft().getLeft().setRight((old)); //
}//om två barn
else{
TreeNode oldRight = currN.getLeft().getRight();// null
currN.setLeft(currN.getLeft().getLeft()); //sätt current left till 11
currN.getLeft().setRight((oldRight)); // current left, right till 13
}
} else {
remove(currN.getLeft(), dataToRemove);
}
}
答案 0 :(得分:0)
是的,有一个已知的实现,当你想删除二进制搜索树中的节点时,你将它与其左子树的最右边的叶子交换,或者右边子树的最左边的叶子然后删除那个叶子。
对于AVL,您必须跟踪平衡条件的递归操作,每当违反该平衡条件时,如果您进行一些研究,则需要根据此违规的结构进行某种旋转。将找到相当数量的资源来解释确切的算法。