簡體   English   中英

BST刪除功能不會刪除目標節點(Java)

[英]BST Delete Function does not Delete Intended Node (Java)

我正在嘗試為我的BST類實現刪除功能。 我正在嘗試遵循一些標准教程,並且除刪除功能外,對所有其他方面都很好。 我沒有收到任何錯誤,但是它沒有刪除預期的節點。 我遞歸到達預期的節點,如果對側節點只有一個孩子,則返回它,否則,我將從n.right返回最小值。

任何幫助將不勝感激-謝謝!

public class BinaryTree {

    private Node root = null;

    private class Node {

        private Node left;
        private Node right;
        private int data;

        public Node(int data, Node left, Node right) {
            this.data = data;
            this.left = left;
            this.right = right;
        }
    }

    public boolean add(int data) {

        root = add(root, data);
        return true;

    }

    private Node add(Node node, int data) {

        if (node == null) {
            node = new Node(data, null, null);
        }

        else {
            if (data < node.data) {
                node.left = add(node.left, data);
            }
            else {
                node.right = add(node.right, data);
            }
        }
        return node;
    }

    // Helper function

    private Node findMin(Node node) {
        while (node.left != null) {
            node = node.left;
        }
        return node;
    }

    private Node findMax(Node node) {
        while (node.right != null) {
            node = node.right;
        }
        return node;
    }

    private void inOrderTraversal(Node n) {
        if (n == null) return;

        else {
            inOrderTraversal(n.left);
            System.out.println(n.data);
            inOrderTraversal(n.right);
        }
    }

    public void inOrderTraversal() {
        inOrderTraversal(root);
    }

    private Node deleteKey(Node n, int data) {

        if (n == null) return n;

        if (data < n.data) deleteKey(n.left, data);
        else if (data > n.data) deleteKey(n.right, data);

        else {
            if (n.left == null) return n.right;
            else if (n.right == null) return n.left;

            n.data =  findMin(n.right).data;
            n.right = deleteKey(n.right, n.data);
        }
        return n;
    }

    public void deleteKey(int data) {
        root = deleteKey(root, data);
    }

    public static void main(String[] args) {

        BinaryTree bst = new BinaryTree();

        bst.add(2);
        bst.add(8);
        bst.add(1);
        bst.add(7);
        bst.add(3);
        bst.add(11);
        bst.add(1);
        bst.add(21);
        bst.add(10);
        bst.add(12);

        bst.inOrderTraversal();

        System.out.println("----------------");

        bst.deleteKey(3);

        bst.inOrderTraversal();
    }
}

我認為問題出在您的deleteKey函數中:

private Node deleteKey(Node n, int data) {

    if (n == null) return n;

    if (data < n.data)
        n.left = deleteKey(n.left, data); // must reassign child here
    else if (data > n.data)
        n.right = deleteKey(n.right, data); // must reassign child here
    else {
        if (n.left == null) return n.right;
        else if (n.right == null) return n.left;

        n.data = findMin(n.right).data;
        n.right = deleteKey(n.right, n.data); // this was correct
    }
    return n;
}

data < n.datadata > n.data ,您不更新當前節點的葉子。 因此,這是在查找要刪除的適當節點,但未在從遞歸備份的途中正確重建節點分支。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM