有没有办法在没有根节点参考的情况下删除二进制树中的任何节点?

时间:2017-03-23 17:17:14

标签: algorithm data-structures language-agnostic binary-tree

enter image description here我正在尝试解决这个问题但却无法破解它。我们有一个二叉树,我想从树中删除一个给定的节点,但我们没有引用根节点。我想知道如何在没有根节点引用的情况下做到这一点。我们确实有对node5的引用,就像图像一样。

2 个答案:

答案 0 :(得分:2)

考虑新编辑更新。

由于这是 二进制搜索树,在这种情况下,我假设树中的节点顺序不相关,树不会有重复,因此可以使用我们在上面定义的相同数据结构删除node5,但我们需要包含父节点引用(对于步骤3 < / strong>详细信息如下):

node {
   d: data
   leftChild: node
   rightChild: node
   parent: node
}

现在,我们可以删除node5修改树,而无需访问/修改 root node1)。

您必须执行以下操作:

  

(请记住节点5 也是二进制子树,所以之后   修改它,我们希望整个二叉树仍然是一个!)

  1. 查找node5最深节点。您需要将node5的节点引用遍历为树。
  2.   

    (*小心你如何传递参数。root应该是副本,   所以它不会以node5'作为根,而是level和。deepestNode   findDeepestNode(root: node, level: integer, deepestNode: node) { if (root != null) { level = level + 1 find(root.left, level) if (level > deepestlevel) { deepestNode = root; // node reference to the deepestNode deepestlevel = level; } find(root.right, level); } } 应该是参考。)

    deepestNode

    执行此操作后,node7node8node5。没关系。

    1. 现在让deepestNode的值等于node5.data = deepestNode.data的值。在我们的伪代码中:
    2.   

      deepestNode //用deleteNode替换node5的值。

      1. 树现在具有重复值。你还有deepestNode。现在,您将deepestNode 父级参考指定为null并删除 if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } $ip = str_replace(' ','', $ip); if(filter_var($ip, FILTER_VALIDATE_IP) === false){ Log::error('IP : '.$ip); return Redirect::to($link->white_url, 301); } 作为参考。 此步骤是我们需要包含父节点引用的原因。
      2. 您的删除已完成!

答案 1 :(得分:0)

除了树本身之外别无其他任何东西,那么在删除之前,您总是必须搜索要删除的节点。如果你可以通过保留指向你可能想要预先删除的节点的指针来为自己的成功做好准备,那么答案可能是肯定的!