利用typedef struct node { int data; struct node* leftchild; struct node* rightchild; }BiTreeNode;和C语言删除二叉排序树的指定节点
时间: 2024-10-20 13:03:46 浏览: 32
在C语言中,利用`typedef struct node`定义了二叉树结点的数据结构,包括数据域(data),以及指向左右子节点的指针(leftchild 和 rightchild)。接下来我们可以使用这个结构体类型来创建和操作二叉搜索树(BiTree)。删除指定节点的过程同样包含三个步骤:
1. **声明和初始化**:
```c
typedef struct node BiTreeNode;
BiTreeNode* newNode(int data) {
BiTreeNode* node = (BiTreeNode*)malloc(sizeof(BiTNode));
node->data = data;
node->leftchild = NULL;
node->rightchild = NULL;
return node;
}
```
2. **寻找和删除**:
```c
void deleteNode(BiTNode** root, int key) {
if (*root == NULL) {
return; // 如果根节点为空,说明节点不存在
}
BiTreeNode* temp = *root;
if (temp->data > key) {
temp->leftchild = deleteNode(&temp->leftchild, key);
} else if (temp->data < key) {
temp->rightchild = deleteNode(&temp->rightchild, key);
} else { // 找到了要删除的节点
if (temp->leftchild == NULL && temp->rightchild == NULL) { // 没有子节点
free(temp);
*root = NULL;
} else if (temp->leftchild == NULL) { // 只有右子节点
BiTreeNode* temp2 = temp->rightchild;
*root = temp2;
free(temp);
} else if (temp->rightchild == NULL) { // 只有左子节点
BiTreeNode* temp2 = temp->leftchild;
*root = temp2;
free(temp);
} else { // 有两个子节点
BiTreeNode* minNode = findMin(temp->rightchild);
temp->data = minNode->data; // 替换为右子树最小节点的数据
temp->rightchild = deleteNode(&temp->rightchild, minNode->data); // 删除右子树的最小节点
}
}
}
```
3. **辅助函数**:查找最小节点
```c
BiTreeNode* findMin(BiTNode* node) {
while (node->leftchild != NULL) {
node = node->leftchild;
}
return node;
}
```
阅读全文