【问题标题】:Not able to understand Binary Search Tree Delete无法理解二叉搜索树删除
【发布时间】:2015-04-15 17:49:09
【问题描述】:

我试图通过此链接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;
 }

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

【问题讨论】:

  • 在您的代码中 isempty() 未定义。那么它有什么作用呢?
  • @Marichyasana 我认为我们可以放心地假设它会检查树是否为空。不过,这与理解或回答问题并不真正相关。

标签: java binary-search-tree


【解决方案1】:

此代码中的最后一个 else 块涵盖了删除具有两个子节点的节点的情况。

代码似乎做的是:

  • 找到有序的后继节点(即右子树中最左边的节点)
  • 将整个原始左子树附加到此节点
  • 返回原来的右孩子作为树的新根

虽然这种迭代实现对我来说似乎是正确的,但我猜在几次删除操作之后你最终会得到一个不平衡的树。

删除操作的recursive 实现虽然一开始更难理解,但通常更容易阅读。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 2013-11-21
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多