首页 文章

无法理解二进制搜索树删除

提问于
浏览
0

我试图从这个链接BinarySearchTree了解BST . 但我在其他部分感到困惑

/* Functions to delete data */
 public void delete(int k)
 {
     if (isEmpty())
         System.out.println("Tree Empty");
     else if (search(k) == false)
         System.out.println("Sorry "+ k +" is not present");
     else
     {
         root = delete(root, k);
         System.out.println(k+ " deleted from the tree");
     }
 }
 private BSTNode delete(BSTNode root, int k)
 {
     BSTNode p, p2, n;
     if (root.getData() == k)
     {
         BSTNode lt, rt;
         lt = root.getLeft();
         rt = root.getRight();
         if (lt == null && rt == null)
             return null;
         else if (lt == null)
         {
             p = rt;
             return p;
         }
         else if (rt == null)
         {
             p = lt;
             return p;
         }
         else
         {
             p2 = rt;
             p = rt;
             while (p.getLeft() != null)
               p = p.getLeft();
             p.setLeft(lt);
             return p2;
         }
     }
     if (k < root.getData())
     {
         n = delete(root.getLeft(), k);
         root.setLeft(n);
     }
     else
     {
         n = delete(root.getRight(), k);
         root.setRight(n);             
     }
     return root;
 }

我无法理解找到右子树的最左边节点然后分配给节点的其他部分 . 但是这里没有那个节点被置为空,而且返回了一个对我来说没有意义的正确节点 . 我希望这是一个正确的实现 . 有人可以帮助我理解这里发生了什么 .

2 回答

  • 0

    此代码中的最后一个else块包含删除具有两个子节点的节点的情况 .

    代码似乎做的是:

    • 找到有序后继节点(即右子树中最左边的节点)

    • 将整个原始左子树附加到此节点

    • 将原始右子项作为树的新根返回

    虽然这个迭代实现对我来说似乎是正确的,但我想在经过一些删除操作之后,你最终得到了一个不 balancer 的树 .

    删除操作的recursive实现虽然起初难以理解,但通常读起来更优雅 .

  • 0

    关键概念是你在谈论二进制搜索树 . 如您所知,BST是有序结构,这意味着对于每个树,左子树中包含的元素都是次要的或等于树根 .

相关问题