我正在尝试解决这个问题但却无法破解它。我们有一个二叉树,我想从树中删除一个给定的节点,但我们没有引用根节点。我想知道如何在没有根节点引用的情况下做到这一点。我们确实有对node5的引用,就像图像一样。
答案 0 :(得分:2)
由于这是不 二进制搜索树,在这种情况下,我假设树中的节点顺序不相关,树不会有重复,因此可以使用我们在上面定义的相同数据结构删除node5
,但我们需要包含父节点引用(对于步骤3 < / strong>详细信息如下):
node {
d: data
leftChild: node
rightChild: node
parent: node
}
现在,我们可以删除node5
修改树,而无需访问/修改 root (node1
)。
您必须执行以下操作:
(请记住节点5 也是二进制子树,所以之后 修改它,我们希望整个二叉树仍然是一个!)
node5
的最深节点。您需要将node5
的节点引用遍历为树。(*小心你如何传递参数。
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
执行此操作后,node7
或node8
为node5
。没关系。
deepestNode
的值等于node5.data = deepestNode.data
的值。在我们的伪代码中:
deepestNode
//用deleteNode替换node5的值。
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);
}
作为参考。 此步骤是我们需要包含父节点引用的原因。 答案 1 :(得分:0)
除了树本身之外别无其他任何东西,那么在删除之前,您总是必须搜索要删除的节点。如果你可以通过保留指向你可能想要预先删除的节点的指针来为自己的成功做好准备,那么答案可能是肯定的!