BST删除方法是否应该删除节点的子树?

时间:2016-09-30 07:37:48

标签: java binary-search-tree removeall

所以我得到了一个用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);
            }
        }

1 个答案:

答案 0 :(得分:0)

是的,有一个已知的实现,当你想删除二进制搜索树中的节点时,你将它与其左子树的最右边的叶子交换,或者右边子树的最左边的叶子然后删除那个叶子。

对于AVL,您必须跟踪平衡条件的递归操作,每当违反该平衡条件时,如果您进行一些研究,则需要根据此违规的结构进行某种旋转。将找到相当数量的资源来解释确切的算法。