删除不适用于Java中的BST

时间:2014-11-12 22:08:21

标签: java binary-search-tree

我正在编写一个在java中实现BST的代码。我的插入,搜索,搜索inorder后继,inorder遍历工作正常,但当我删除一个节点时,它实际上没有被删除。考虑最简单的情况,其中要删除的节点是悬挂节点。即使我将此节点设置为null,它仍然会在删除后按顺序遍历打印。有人可以帮忙吗?
谢谢。

package pack_l;

class BSTNode
{
  int key;
  BSTNode left;
  BSTNode right;

  BSTNode(int key)
  {
    this.key = key;
    this.left = this.right = null;
  }
}

class BST
{
  BSTNode root;

  BST()
  {
    root = null;
  }

  /*insert a node at proper position*/
  void insert(BSTNode n)
  {
    if(root == null)
      root = n;
    else
    {
      BSTNode node = root;
      while(node != null)
      {
        if(node.key > n.key)
        {
          if(node.left == null)
          {
            node.left = n;
            return;
          }
          else 
            node = node.left;
        }                   
        else
        {
          if(node.right == null)
          {
            node.right = n;
            return;
          }
          else 
            node = node.right;  
        }
      }/*End of while-loop*/
    }
  }

  /*Search a node in the whole tree*/
  BSTNode search(int val)
  {
    BSTNode node = root;
    while(node != null)
    {
      if(node.key == val)
        return node;
      else if(node.key > val)
        node = node.left;
      else
        node = node.right;
    }
    return null;
  }

  /*Remove a node from the tree*/
  boolean remove(int val)
  {
    BSTNode delNode = search(val);              

    /*If the node is not in the BST*/
    if(delNode == null)
      return false;

    /*If the node has no child*/
    if(delNode.left == null && delNode.right == null)
      delNode = null;

    return true;
  }

  void inorder(BSTNode root)
  {
    if(root == null)
        return;

    inorder(root.left);
    System.out.print(" " + root.key + " ");
    inorder(root.right);
  }
}

public class BSTree {

public static void main(String[] args) {

    BST tree = new BST();
    BSTNode n1 = new BSTNode(15);
    tree.insert(n1);
    System.out.println("Before:");
    tree.inorder(tree.root);
    tree.remove(15);
    System.out.println("\nAfter:");
    tree.inorder(tree.root);
    }
}

1 个答案:

答案 0 :(得分:0)

设置delnode = null不执行任何操作:您拥有对节点的引用的本地副本,并且您将其更改为引用null。这根本不会改变内存中的实际节点。

相反,您必须找到它的父级并将该父级的左侧或右侧引用(取决于要删除的节点)设置为null。