删除二进制搜索树的方法?

时间:2017-10-21 20:13:30

标签: java

好的,所以我想编写一个适用于Binary Search Trees的任何“delete-case”的删除方法,这是我的尝试:

Text ID Prior ID
Text1 1   1
Text2  1   2 
Text3  1   3
Text4  2   4

但是当我实际使用Main中的delete方法时,它会发出一个NullPointerException。

错误消息显示:

 public void delete(int key) {
 if (root.value == key) {
   root = root.right;
   root.left = root.right.left;
   return;
 }
 else {
   deleteRecursive(key, root);  ***LINE 58***
 }

 }

 public void  deleteRecursive(int key, BinaryNode node) {
 if (node == null) {
   System.out.println("ERROR");
   return;
 }
 else {
   if (key < node.value) {
     // continue search on left
     if (node.left.value == key) {
       if (node.left.left == null && node.left.right == null) {
         node.left = null;     
       }
       else if (node.left.left == null){
         node.left = node.left.right;
       }
       else if (node.left.right == null){
         node.left = node.left.left;
       }
       else{
         node.left = node.left.right;
         node.left.left = node.left.right.left;  ***LINE 83***
       }
     }
     else {
       deleteRecursive (key, node.left);
     }
   }
   else if (key > node.value){
     // continue search on right
     if (node.right.value == key) {
       if (node.right.left == null && node.right.right == null) {
         node.right = null;
       }
       else if (node.right.left == null){
         node.right = node.right.right;
       }
       else if (node.right.right == null){
       }
       else if (node.left.left != null && node.left.right != null){
         node.right = node.right.right;
         node.right.left = node.right.right.left;
       }
     }
     else {
       deleteRecursive (key, node.right);
     }
   }
 }
}

所以我假设它在第83和58行(在代码中标记)。

我一直坐在这里,最后一小时试图解决它,似乎无法得到它。

我不是Java中最好的,所以我想我可以在这里寻求帮助! :)

以下是运行程序的所有文件(除了删除方法之外的所有内容都已提供):https://www.dropbox.com/sh/r1bt2880hnn6tjm/AADsRsOOzuiNKHp-ZC-IrvVta?dl=0

1 个答案:

答案 0 :(得分:0)

由于您尝试从二进制搜索树中删除,因此最好使其完全递归而不是部分递归。

private BinaryNode deleteRecursive( int data,BinaryNode node) {
  if(node==null){
      return null;
  }
  if(data==node.value)
  {
      if(node.left!=null && node.right!=null){
          BinaryNode minNode = getHighestNodeFromRight(node.right);
          node.value = minNode.value;
          node.right = deleteRecursive(minNode.value, node.right);

          //System.out.println(minNode);
      }
      else if(node.left==null){
      return node.right;
      }
      else{
      return node.left;
      }
  }
  else if(data>node.value){
  node.right = deleteRecursive( data,node.right);
  }
  else{
      node.left = deleteRecursive(data, node.left);
  }
  return node;
}


public BinaryNode getHighestNodeFromRight(BinaryNode node){
      if(node.left==null){
          return node;
      }
      else{
          BinaryNode n = getHighestNodeFromRight(node.left);
          return n;
      }
}