在 C++ 中删除二叉树?
删除是通过用底部和最右边的节点替换删除模式来执行的。
让我们首先定义表示包含数据及其左右节点子节点的树节点的结构。如果这是要创建的第一个节点,则它是根节点,否则是子节点。
struct Node { int data; struct Node *leftChild, *rightChild; };
接下来我们创建我们的newNode(intdata)函数,它接受一个int值并将其分配给节点的数据成员。该函数返回指向创建的结构节点的指针。此外,新创建的节点的左右子节点设置为空。
struct Node* newNode(int data){ struct Node* newNode = new Node; newNode->data = data; newNode->leftChild = newNode->rightChild = NULL; return (newNode); }
delete(structNode*root,intdata)函数用于删除具有给定数据值的节点。它需要根节点和要搜索和删除的数据值。如果没有任何子节点并且数据值等于根的数据值,则返回空值,否则返回根节点。
Node* deletion(struct Node* root, int data){ if (root == NULL) return NULL; if (root->leftChild == NULL && root->rightChild == NULL) { if (root->data == data) return NULL; else return root; }
现在我们创建一个structNode*类型的队列并将其命名为q并将根节点推送到q。我们还声明了指向Node的指针temp和data_node,并将data_node设置为NULL。
struct Node* temp; struct Node* data_node = NULL;
接下来,我们执行层序遍历以找到最深的节点。while循环一直执行到队列q不为空。队列是一个FIFO数据结构,所以队列中的最后一个元素将是最右边最深的节点,因为我们正在按级别顺序遍历。temp总是指向队列的前面,随着我们继续,元素从前面弹出。
while (!q.empty()) { temp = q.front(); q.pop(); if (temp->data == data) data_node = temp; if (temp->leftChild) q.push(temp->leftChild); if (temp->rightChild) q.push(temp->rightChild); }
接下来,如果data_node不为NULL,那么我们将要删除的节点数据存储在x中,并删除最深节点的temp。然后将data_node值替换为最深的节点值,并删除最深的节点。删除和替换后从函数返回新节点。
if (data_node != NULL) { int x = temp->data; deleteDeepest(root, temp); data_node->data = x; }
deleteDeepest(structNode*root,structNode*deepestNode)函数检查传递的节点是否实际上是最深的节点,或者它的右子节点或左子节点是最深的节点,在这种情况下,它在删除父节点之前将子节点值设置为null最深的节点。
void deleteDeepest(struct Node* root, struct Node* deepestNode){ queueq; q.push(root); struct Node* temp; while (!q.empty()) { temp = q.front(); q.pop(); if (temp == deepestNode) { temp = NULL; delete (deepestNode); return; } if (temp->rightChild) { if (temp->rightChild == deepestNode) { temp->rightChild = NULL; delete (deepestNode); return; } else q.push(temp->rightChild); } if (temp->leftChild) { if (temp->leftChild == deepestNode) { temp->leftChild = NULL; delete (deepestNode); return; } else q.push(temp->leftChild); } } }
示例
让我们看看以下实现以查看二叉树中的删除-
#include#include using namespace std; struct Node { int data; struct Node *leftChild, *rightChild; }; struct Node* NewNode(int data){ struct Node* temp = new Node; temp->data = data; temp->leftChild = temp->rightChild = NULL; return temp; }; void inorder(struct Node* temp){ if (!temp) return; inorder(temp->leftChild); cout << temp->data << " "; inorder(temp->rightChild); } void deleteDeepest(struct Node* root, struct Node* deepestNode){ queue q; q.push(root); struct Node* temp; while (!q.empty()) { temp = q.front(); q.pop(); if (temp == deepestNode) { temp = NULL; delete (deepestNode); return; } if (temp->rightChild) { if (temp->rightChild == deepestNode) { temp->rightChild = NULL; delete (deepestNode); return; } else q.push(temp->rightChild); } if (temp->leftChild) { if (temp->leftChild == deepestNode) { temp->leftChild = NULL; delete (deepestNode); return; } else q.push(temp->leftChild); } } } Node* deletion(struct Node* root, int data){ if (root == NULL) return NULL; if (root->leftChild == NULL && root->rightChild == NULL) { if (root->data == data) return NULL; else return root; } queue q; q.push(root); struct Node* temp; struct Node* data_node = NULL; while (!q.empty()) { temp = q.front(); q.pop(); if (temp->data == data) data_node = temp; if (temp->leftChild) q.push(temp->leftChild); if (temp->rightChild) q.push(temp->rightChild); } if (data_node != NULL) { int x = temp->data; deleteDeepest(root,temp); data_node->data = x; } return root; } //驱动程序代码 int main(){ struct Node* root = NewNode(12); root->leftChild = NewNode(13); root->leftChild->leftChild = NewNode(9); root->leftChild->rightChild = NewNode(14); root->rightChild = NewNode(11); root->rightChild->leftChild = NewNode(17); root->rightChild->rightChild = NewNode(10); cout << "删除前的中序遍历: "; inorder(root); int data = 13; root = deletion(root, data); cout < 输出结果 上面的代码将产生以下输出-
删除前的中序遍历: 9 13 14 12 17 11 10 删除后的中序遍历: 9 10 14 12 17 11