AVLTree节点删除

时间:2016-11-15 19:58:24

标签: java binary-search avl-tree

因此,对于类I,我的任务是创建一个AVLTree,它可以添加/删除节点并以特殊方式打印所有节点。我完成了这个。 Eveyrthing在我的本地计算机上运行良好。但是,当我将代码上传到在线提交服务器并使用命令行输入进行测试时;我的一个功能停止工作,我希望有人可以解释原因。

这是我计算机上的主要方法:

        AVLTree avl = new AVLTree();
        avl.insert(5, "earl");
        avl.insert(3, "colin");
        avl.insert(6, "fiona");
        avl.show();
        avl.insert(2, "bonnie");
        avl.insert(4, "danielle");
        avl.show();
        avl.insert(1, "alex");
        avl.show();
        avl.delete("bonnie");
        avl.delete("alex");
        avl.show();

这是我用于命令行输入的第二个主要方法

public static void main(String[] args) throws FileNotFoundException{
        Scanner input = new Scanner(new File(args[0]));
        String name = new String();
        int key = 0;
        AVLTree avl = new AVLTree();
        while (input.hasNext()) {
            String opt = input.next().toUpperCase();
            switch(opt)
            {
               case "INSERT":
                  name  = input.next();
                  key = input.nextInt();
                  avl.insert(key, name);
                  break;
                case "REMOVE":
                              name = input.next();
                      System.out.println("***" + avl.search(name));//this is where the problem is. On the server it returns null, on my computer it returns the correct node
                    avl.delete(name);
                    break;
                case "SHOW":
                          avl.show();
                          break;
            }

        }
    }


}

两者的主要不同,因为我没有在我的计算机上使用命令行,所以我将输入文件复制到计算机版本上并手动输入所有内容。

这是输入文件

insert Earl 5
insert Colin 3
insert Fiona 6
show
insert Bonnie 2
insert Danielle 4
show
insert Alex 1
show
remove Bonnie
remove Alex
show

最后,这里是删除节点所需的功能。

public boolean delete(String name) {
        Node target = search(name);
        if (target == null) return false;
        target = deleteNode(target);
        balanceTree(target.parent);
        return true;
    }

    private Node deleteNode(Node target) {
        if (isLeaf(target)) { //leaf
            if (isLeftChild(target)) {
                target.parent.left = null;
            } else {
                target.parent.right = null;
            }
        } else if (target.left == null ^ target.right == null) { //exact 1 child
            Node nonNullChild = target.left == null ? target.right : target.left; 
            if (isLeftChild(target)) {
                target.parent.setLeftChild(nonNullChild); 
            } else {
                target.parent.setRightChild(nonNullChild);
            }
        } else {//2 children
            Node immediatePredInOrder = immediatePredInOrder(target);
            target.value = immediatePredInOrder.value;
            target = deleteNode(immediatePredInOrder);
        }

        reHeight(target.parent);
        return target;
    }   
    public Node search(String name) {
        return binarySearch(root, name);
    }
    private Node binarySearch(Node node, String name) {
        if (node == null) 
        return null;
        if (name == node.name) 
            return node;
        else {
            Node foundNode = binarySearch(node.left, name);
            if(foundNode == null) {
                foundNode = binarySearch( node.right, name);
            }
            return foundNode;

        }

    }

问题是搜索功能找不到服务器版本上的节点,我无法弄清楚原因。

此外,这是输出

    Local Version
    earl 5
       colin 3
       fiona 6
    earl 5
       colin 3
          bonnie 2
          danielle 4
       fiona 6
    colin 3
       bonnie 2
          alex 1
       earl 5
          danielle 4
          fiona 6
    ***bonnie 2//the println statement for search

    earl 5
       colin 3

Server Version

Earl 5
   Colin 3
   Fiona 6
Earl 5
   Colin 3
      Bonnie 2
      Danielle 4
   Fiona 6
Colin 3
   Bonnie 2
      Alex 1
   Earl 5
      Danielle 4
      Fiona 6
***null//search println
***null//search println
Colin 3
   Bonnie 2
      Alex 1
   Earl 5
      Danielle 4
      Fiona 6

          danielle 4
       fiona 6

1 个答案:

答案 0 :(得分:0)

我的教授和我能够谈论这些,我们发现问题是由于java版本的差异。

我们只是改变了

if (name == node.name)

if (name.compareTo(node.name) == 0)

binarySearch()方法

中的