删除以每一个元素值为x的结点的子树,完整的遍历整颗二叉树。
void DeleteTree(BiTree &bt){
if(bt){
DeleteTree(bt->lchild);
DeleteTree(bt->rchild);
free(bt);
}
}
void Search(BiTree bt,int x){
BiTree Q[];
if(bt){
if(bt->data==x){
DeleteTree(bt);
exit(0);
}
InitQueue(Q);
EnQueue(Q,bt);
while(!QueueEmpty(Q)){
DeQueue(Q,p);
if(p->lchild){
if(p->lchild->data==x){
DeleteTree(p->lchild);
p->lchild=NULL;
}
else{
EnQueue(Q,p->lchild);
}
}
if(p->rchild){
if(p->rchild->data==x){
DeleteTree(p->rchild);
p->rchild=NULL;
}
else{
EnQueue(Q,p->rchild);
}
}
}
}
}
### 函数 `DeleteTree`
```cpp
void DeleteTree(BiTree &bt){
```
- **函数定义**:这个函数接受一个二叉树的引用 `bt`,并删除它的所有节点。
```cpp
if(bt){
```
- **条件检查**:如果 `bt` 不是 `NULL`(即树或子树不为空),则继续删除过程。
```cpp
DeleteTree(bt->lchild);
```
- **递归调用**:递归删除当前节点的左子树。这一步确保所有位于当前节点左侧的节点都被删除。
```cpp
DeleteTree(bt->rchild);
```
- **递归调用**:递归删除当前节点的右子树。这一步确保所有位于当前节点右侧的节点都被删除。
```cpp
free(bt);
```
- **释放内存**:释放当前节点的内存空间,完成当前节点的删除。
### 函数 `Search`
```cpp
void Search(BiTree bt, int x){
```
- **函数定义**:这个函数用于在二叉树中查找并删除包含特定值 `x` 的节点及其子树。
```cpp
BiTree Q[];
```
- **定义队列**:定义了一个队列 `Q`,用于辅助搜索过程。
```cpp
if(bt){
```
- **条件检查**:如果树或子树不为空,则进行搜索。
```cpp
if(bt->data == x){
DeleteTree(bt);
exit(0);
}
```
- **节点值匹配检查**:如果当前节点的值等于目标值 `x`,则调用 `DeleteTree` 函数删除以该节点为根的子树,并终止程序。
```cpp
InitQueue(Q);
EnQueue(Q, bt);
```
- **初始化和入队**:初始化队列 `Q` 并将根节点入队。
```cpp
while(!QueueEmpty(Q)){
DeQueue(Q, p);
```
- **队列循环**:当队列不为空时,循环执行以下操作:出队一个节点 `p`。
```cpp
if(p->lchild){
if(p->lchild->data == x){
DeleteTree(p->lchild);
p->lchild = NULL;
}
else{
EnQueue(Q, p->lchild);
}
}
```
- **左子树处理**:如果当前节点 `p` 的左子节点存在,则检查其值是否等于目标值 `x`。如果是,则删除以左子节点为根的子树,否则将左子节点入队。
```cpp
if(p->rchild){
if(p->rchild->data == x){
DeleteTree(p->rchild);
p->rchild = NULL;
}
else{
EnQueue(Q, p->rchild);
}
}
```
- **右子树处理**:如果当前节点 `p` 的右子节点存在,则检查其值是否等于目标值 `x`。如果是,则删除以右子节点为根的子树,否则将右子节点入队。