c++递归实现二叉树叶结点的删除
时间: 2024-11-09 19:06:18 浏览: 15
在C++中,递归实现二叉树节点的删除通常涉及到三种情况:如果待删除节点没有子节点、有一个子节点或者有两个子节点。以下是递归删除叶节点的基本步骤:
1. **没有子节点**:
- 如果待删除的节点`node`没有左孩子也没有右孩子,直接将其从父节点中移除。
```cpp
void deleteLeaf(Node* &parent, Node* node) {
if (!node->left && !node->right)
parent = nullptr; // 如果parent存在则移除当前节点,否则不做操作
}
```
2. **只有一个子节点**:
- 如果只有左孩子或右孩子,将该子节点替换到原节点的位置,并释放原节点。
```cpp
void deleteLeaf(Node* &parent, Node* node) {
if (node->left) { // 如果是左子节点
*node = *node->left;
delete node->left; // 删除空节点
} else if (node->right) { // 如果是右子节点
*node = *node->right;
delete node->right;
}
parent = node; // 更新parent指针
}
```
3. **两个子节点**:
- 这种情况下需要找到右子树中的最小值节点(左旋),然后用它替换待删除的节点,最后删除这个最小节点。
```cpp
Node* findMin(Node* node) {
while (node->left) {
node = node->left;
}
return node;
}
void deleteLeaf(Node* &parent, Node* node) {
if (node->left == nullptr && node->right == nullptr) {
// 直接删除
} else {
Node* minNode = findMin(node->right);
*node = *minNode; // 将最小节点复制到待删除节点
delete minNode; // 删除最小节点
deleteLeaf(parent, minNode); // 继续在新位置递归删除
}
}
```
记得在实际操作前检查节点是否为空,防止非法访问。删除后别忘了调整父节点的引用,保持树结构的完整。
阅读全文