首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的Java Binary Search Tree类没有实际删除节点,而我告诉它这样做?

为什么我的Java Binary Search Tree类没有实际删除节点,而我告诉它这样做?
EN

Stack Overflow用户
提问于 2015-02-19 10:03:25
回答 1查看 645关注 0票数 1

我正在用Java构建一个二进制搜索树,以便更好地理解它们是如何工作的,并且我正在使用这个函数来删除具有特定值的节点。

我基本上遍历树,直到找到具有正确值的节点,然后根据它有多少子节点执行相应的操作。

如果它没有子元素,我将其设置为null。如果它有一个,我会将它自己设置为等于这个孩子。如果它有两个,我遍历左边的树,沿着左边直到我到达左边,然后删除它,并将我所在的节点的值设置为删除的节点的值。

代码语言:javascript
复制
class BTree {
    public int data;
    public BTree leftTree;
    public BTree rightTree;

    public BTree(int data) {
        this.data = data;
    }

    public BTree(int data, BTree leftTree, BTree rightTree) {
        this.data = data;
        this.leftTree = leftTree;
        this.rightTree = rightTree;
    }

    public void insert(int data) {
        if (data < this.data) {
            if (this.leftTree == null) {
                BTree newTree = new BTree(data);
                this.leftTree = newTree;
            } else {
                insert(this.leftTree, data);
            }
        } else {
            if (this.rightTree == null) {
                BTree newTree = new BTree(data);
                this.rightTree = newTree;
            } else {
                insert(this.rightTree, data);
            }
        }
    }

    private void insert(BTree tree, int data) {
        if (tree.data == data) {
            return;
        }

        if (data < tree.data) {
            if (tree.leftTree == null) {
                BTree newTree = new BTree(data);
                tree.leftTree = newTree;
            } else {
                insert(tree.leftTree, data);
            }
        } else {
            if (tree.rightTree == null) {
                BTree newTree = new BTree(data);
                tree.rightTree = newTree;
            } else {
                insert(tree.rightTree, data);
            }
        }
    }

    public void inorderTraversal(BTree tree) {
        if (tree.leftTree != null) {
            inorderTraversal(tree.leftTree);
        }

        System.out.print(tree.data + ", ");

        if (tree.rightTree != null) {
            inorderTraversal(tree.rightTree);
        }
    }

    public void remove(int data, BTree tree) {
        if (tree == null) {
            return;
        }

        if (data == tree.data) {
            if (tree.leftTree != null && tree.rightTree != null) {
                int minimumValue = getMinimumValue(tree.leftTree);
                remove(minimumValue, tree);

                tree.data = minimumValue;
            } else if (tree.leftTree != null) {
                tree = tree.leftTree;
            } else if (tree.rightTree != null) {
                tree = tree.rightTree;
            } else {
                tree = null;
            }
        } else if (data < tree.data) {
            remove(data, tree.leftTree);
        } else {
            remove(data, tree.rightTree);
        }
    }

    public int getMinimumValue(BTree tree) {
        if (tree.leftTree == null) {
            return tree.data;
        } else {
            return getMinimumValue(tree.leftTree);
        }
    }

    public static void main(String[] args) {
        BTree myTree = new BTree(5);
        myTree.insert(6);
        myTree.insert(12);
        myTree.insert(4);
        myTree.insert(3);
        myTree.insert(6);
        myTree.insert(15);
        myTree.insert(1);
        myTree.insert(9);
        myTree.insert(-2);

        myTree.remove(3, myTree);

        myTree.inorderTraversal(myTree);
    }
}

尽管如此,3仍然出现在顺序遍历中。我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2015-02-19 19:13:40

您的第二个插入在我看来很奇怪,因为您只需要创建一个包含数据的新BTree,或者只需使用您已经在其中的同一个插入就可以处理所有可能的情况。inOrderTraversal也是如此。

对于remove,你需要返回一个BTree,以处理"this“引用是你想要删除的那个引用的情况(你不能指定"this")。

代码语言:javascript
复制
class BTree {

    public int data;
    public BTree leftTree;
    public BTree rightTree;

    public BTree(int data) {
        this.data = data;
    }

    public BTree(int data, BTree leftTree, BTree rightTree) {
        this.data = data;
        this.leftTree = leftTree;
        this.rightTree = rightTree;
    }

    public void insert(int data) {
        if (this.data == data) {
            return;
        }

        if (data < this.data) {
            if (leftTree == null) {
                leftTree = new BTree(data);
            } else {
                leftTree.insert(data);
            }
        } else {
            if (this.rightTree == null) {
                rightTree = new BTree(data);
            } else {
                rightTree.insert(data);
            }
        }
    }

    public void inOrderTraversal() {
        if (leftTree != null) {
            leftTree.inOrderTraversal();
        }

        System.out.print(data + ", ");

        if (rightTree != null) {
            rightTree.inOrderTraversal();
        }
    }

    //the void equivalents are in comments
    public BTree remove(int data) {
        if (data == this.data) {
            if (leftTree != null && rightTree != null) {
                //this is the only legal case for the void remove.
                int minValue = getMinimumValue();
                this.data = minValue;
                //leftTree.remove(minValue); //and no return is needed
                leftTree = leftTree.remove(minValue);
                return this;
            } else if (leftTree != null) {
                //this = leftTree; //illegal
                return leftTree;
            } else if (rightTree != null) {
                //this = rightTree; //illegal
                return rightTree;
            } else {
                //this = null; //illegal
                return null;
            }
        } else if (data < this.data) {
            leftTree = leftTree.remove(data);
            return this;
        } else {
            rightTree = rightTree.remove(data);
            return this;
        }
    }

    public int getMinimumValue() {
        if (leftTree == null) {
            return data;
        } else {
            return leftTree.getMinimumValue();
        }
    }

    public static void main(String[] args) {
        BTree myTree = new BTree(5);
        myTree.insert(6);
        myTree.insert(12);
        myTree.insert(4);
        myTree.insert(3);
        myTree.insert(6);
        myTree.insert(15);
        myTree.insert(1);
        myTree.insert(9);
        myTree.insert(-2);

        myTree = myTree.remove(3);

        myTree.inOrderTraversal();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28597497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档