簡體   English   中英

刪除不適用於Java中的BST

[英]Removal not working for BST in java

我正在編寫用於在Java中實現BST的代碼。 我的插入,搜索,搜索有序后繼,有序遍歷都可以,但是當我刪除節點時,它實際上並沒有被刪除。 考慮最簡單的情況,其中要刪除的節點是一個懸掛節點。 即使我將此節點設置為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);
    }
}

設置delnode = null不會執行任何操作:您具有對節點的引用的本地副本,並將其更改為引用null 這根本不會改變內存中的實際節點。

相反,您必須找到其父級,並將該父級的左參考或右參考(取決於要刪除的節點)設置為null。

暫無
暫無

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

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