【问题标题】:How I can implement delete code in my BST?如何在我的 BST 中实现删除代码?
【发布时间】:2011-12-27 00:17:29
【问题描述】:

我有这个关于二叉搜索树的代码,我想要计算插入、删除和查找 BST 中的最大值和最小值的效率

我是这样插入的

public static void main(String args[]) {
    BinarySearchTree bst = new BinarySearchTree();
    Random random = new Random(System.currentTimeMillis());
    int[] randoms = new int[1000];

    Random randGen = new Random();
    long start = System.currentTimeMillis();
    for (int i = 0; i < randoms.length; i++) {
        bst.insert(random.nextInt(10));
    }

    System.out.println("\n sorted :");
    random.nextInt(10);
    bst.inorderTraversal();
    long end = System.currentTimeMillis();
    System.out.println("\n Running Time for insert ");

    System.out.println(end - start);
}

我有这个删除代码,想修改它以适合我的插入代码,但我无法输出

public static void main(String[] args){
        pBSTRemoveNode tree = null;
        int[] numbers = {56,86,71,97,82,99,65,36,16,10,28,52,46};
        System.out.print("inserting: ");
        for(int i = 0;i<numbers.length;i++){
            Integer n = new Integer(numbers[i]);
            System.out.print(" "+n);
            tree = tree_AddNumber(tree,n);
        }
        System.out.print("\ntree: ");
        tree_InOrderPrint(tree);
        for(int j = 0;j < numbers.length;j++){
            Integer n = new Integer(numbers[j]);
            System.out.print("\nremove: "+n+" tree: ");
            tree = tree_removeNumber(tree,n);
            tree_InOrderPrint(tree);
        }
        System.out.println("\ndone ;-)");
    }
}

我想在 main 中调用它的删除方法

public void delete( Node node, int data ) {
        if( node == null ) {
            return;
        }

        else if ( data == node.data) {

            if( node.left == null ) {
                swap( node, node.right ); 
            } 

            else if( node.right == null ) {
                swap( node, node.left );
            } 

            else {
                Node minNode = node.right;

                while( minNode.left != null ) {
                    minNode = minNode.left;
                }

                if( minNode.parent != node ) {
                    swap( minNode, minNode.right );
                    minNode.right = node.right;
                    minNode.right.parent = minNode;
                }

                swap( node, minNode );
                minNode.left = node.left;
                minNode.left.parent = minNode;
            }  
        } 
        // Continue searching in the left subtree.
        else if( data < node.data) {
            delete( node.left, data );
        } 
        // Continue searching in the right subtree.
        else {
            delete( node.right, data );
        }
    }

【问题讨论】:

  • 如果我理解您的问题,您是否想要这些各种操作的运行时,以及删除方法的正确实现?
  • 是的,我想在 main 中调用 delete 方法,方法是使用 for 循环和插入中的随机数
  • swap 是做什么的?如果它确实如其名称所暗示的那样(对我而言),那么您的 delete 是错误的。
  • 那swap做什么 private void swap( Node a, Node b ) { if( a.parent == null ) { root = b; } else if( a == a.parent.left ) { a.parent.left = b; } 其他 { a.parent.right = b; } if( b != null ) { b.parent = a.parent; } }
  • 好吧,我觉得名字(swap)是错误的,但是方法是对的。如果您想用树中可能不存在的数据测试delete,只需复制insert 的测试代码并交换方法名称。如果你想测试delete,只存在(或主要)数据,将一堆数据插入树中,并将它们存储在一个数组中,然后for(int i = 0; i &lt; blah; ++i){ delete(root, store[random.nextInt(store.length)]);}

标签: java binary-tree processing-efficiency


【解决方案1】:

我认为本质上在交换方法中,您正在交换数据。如果是这样,那么下面的代码就可以了。

void swap(Node a, Node b) { if(a != null && b != null) { int data = a.data; a.data = b.data; b.data = data; } }

插入的复杂度是 O(h),其中 h 是树的高度。 在最好的情况下(树是平衡的)它是 O(log N),其中 N 是节点的数量。 在最坏的情况下(树不平衡,BST 中就是这种情况)它是 O(N),其中 N 是节点数。

这个逻辑适用于最大值和最小值。

首先找到包含给定数据的节点。例如, 节点 n = 查找(数据); 然后调用 delete(n);

public void delete( Node node) {
         if( node == null ) {
            return;
         }
         if( node.left == null ) {
                swap( node, node.right );
                node.right=null;
         } 
         else if( node.right == null ) {
                swap( node, node.left );
                node.left=null;
         } 
         else {
             Node minNode = node.right;
             while( minNode.left != null ) {
                  minNode = minNode.left;
             }
             swap( node, minNode );
             delete(minNode); // call recursively until you find a node whose left or right is null

        } 
    }

【讨论】:

  • 如何使用for循环在main中调用delete方法并删除随机数
  • 在 main 中,尝试使用二分搜索,因为它是 BST(不要遍历所有节点,这违背了 BST 的目的)。然后从你的 main 调用 delete(Node node) 方法。
  • 如果您需要任何其他详细信息,请告诉我
猜你喜欢
  • 2015-06-05
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多