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

Java 无法理解二进制搜索树删除,java,binary-search-tree,Java,Binary Search Tree,我试图从这个链接理解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");

我试图从这个链接理解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;
 }
/*用于删除数据的函数*/
公共无效删除(int k)
{
if(isEmpty())
System.out.println(“树空”);
else if(搜索(k)=false)
System.out.println(“对不起”+k+“不存在”);
其他的
{
根=删除(根,k);
System.out.println(k+“从树中删除”);
}
}
专用BSTNode删除(BSTNode根,int k)
{
节点p,p2,n;
if(root.getData()==k)
{
BST节点lt、rt;
lt=root.getLeft();
rt=root.getRight();
如果(lt==null&&rt==null)
返回null;
else if(lt==null)
{
p=rt;
返回p;
}
else if(rt==null)
{
p=lt;
返回p;
}
其他的
{
p2=rt;
p=rt;
while(p.getLeft()!=null)
p=p.getLeft();
p、 左置位(lt);
返回p2;
}
}
if(k
我无法理解右子树最左边的节点被找到并分配给该节点的其他部分。 但在这里,这两个节点都不设为null,并返回right节点,这对我来说没有意义。我希望这是一个正确的实施。
有人能帮我了解一下这里发生了什么。

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

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

代码的作用似乎是:

  • 查找顺序后续节点(即右子树中最左边的节点)
  • 将整个原始左子树追加到此节点
  • 将原始的右子级作为树的新根返回
虽然这个迭代实现对我来说似乎是正确的,但我猜在执行了一些删除操作之后,您最终会得到一个不平衡的树


delete操作的实现虽然一开始很难理解,但通常更易于阅读。

代码中未定义isempty()。那么它做什么呢?@Marichyasana我想我们可以放心地假设它检查树是否是空的。不过,这与理解或回答问题无关。