具有两个子节点的节点被左侧子树的最大子节点替换

因此,我正在尝试修改remove方法,以便将具有两个子节点的节点替换为左侧子树的最大子节点。

我不知道该怎么做或从哪里开始,我真的很为难。我已经读过教科书,但不知道该怎么办。

代码如下:

package BSTStuff;

public class Thing {
    public class BinarySearchTree {
        private Node root;

        public BinarySearchTree() {

            root = null;
        }

        public void add(Comparable obj) {
            Node newNode = new Node();
            newNode.data = obj;
            newNode.left = null;
            newNode.right = null;
            if (root == null) root = newNode;
            else root.addNode(newNode);
        }

        public boolean find(Comparable obj) {
            Node current = root;
            while (current != null) {
                int d = current.data.compareTo(obj);
                if (d == 0) return true;
                else if (d > 0) current = current.left;
                else current = current.right;
            }
            return false;
        }

        public void remove(Comparable obj) {
            Node toberemoved = root;
            Node parent = null;
            boolean found = false;
            while (!found && toberemoved != null) {
                int d = toberemoved.data.compareTo(obj);
                if (d == 0) found = true;
                else {
                    parent = toberemoved;
                    if (d > 0) toberemoved = toberemoved.left;
                    else toberemoved = toberemoved.right;
                }
            }

            if (!found) return;
            if (toberemoved.left == null || toberemoved.right == null) {
                Node newChild;
                if (toberemoved.left == null) newChild = toberemoved.right;
                else newChild = toberemoved.left;

                if (parent == null) root = newChild;
                else if (parent.left == toberemoved) parent.left = newChild;
                else parent.right = newChild;
                return;
            }

            Node smallestParent = toberemoved;
            Node smallest = toberemoved.right;
            while (smallest.left != null) {
                smallestParent = smallest;
                smallest = smallest.left;
            }

            toberemoved.data = smallest.data;
            if (smallestParent == toberemoved) smallestParent.right = smallest.right;
            else smallestParent.left = smallest.right;
        }

        class Node {
            public Comparable data;
            public Node left;
            public Node right;

            public void addNode(Node newNode) {
                int comp = newNode.data.compareTo(data);
                if (comp < 0) {
                    if (left == null) left = newNode;
                    else left.addNode(newNode);
                }
                if (comp > 0) {
                    if (right == null) right = newNode;
                    else right.addNode(newNode);
                }
            }

            public void printNodes() {
                if (left != null) left.printNodes();
                System.out.print(data + " ");
                if (right != null) right.printNodes();
            }
        }
    }
}

不应有任何输出...

denny88613 回答:具有两个子节点的节点被左侧子树的最大子节点替换

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3126669.html

大家都在问