C++ "destructive procedural variant"导致以前版本的二叉搜索树丢失

C++ "destructive procedural variant" results in prior version of binary search tree being lost

本文关键字:版本 搜索树 procedural destructive variant C++      更新时间:2023-10-16

我一直在审查C 指针和参考文献,并希望验证我在以下示例中了解了Wikipedia的以下示例中的"破坏性程序变体"的含义:

这是在C 中的二进制树中可以执行典型的二进制搜索树的插入方式:

Node* insert(Node*& root, int key, int value) {
  if (!root) 
    root = new Node(key, value);
  else if (key < root->key)
    root->left = insert(root->left, key, value);
  else  // key >= root->key
    root->right = insert(root->right, key, value);
  return root;
}

上述破坏性程序变体修改了树的位置。 它仅使用恒定的堆空间(并且迭代版本使用 恒定的堆栈空间也(,但是树的先前版本是 迷失。

是这里的重点(无需双关语(,当我们的指针被引用到新节点对象时,可能还有其他" root"指针的其他副本仍会指向零值?

如果是,那么为什么要使用"树的先前版本丢失"呢?(在C 中,不是一个简单的解决方案是确保没有人存储指向零二进制树的指针,或者确保它们存储对根指针而不是副本的引用?(

在Wikipedia条目中进一步向下,将Python的行为视为一个对比示例。在那里,您会看到在树上"添加"一个节点实际上创建了带有额外节点的新树。因此,在这种情况下仍可以引用插入插入之前的树。

但是,在C 示例中,当插入新节点并丢失了先前的状态时,树结构会更改。