数据结构-树-应用题-5.3-11

删除以每一个元素值为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`。如果是,则删除以右子节点为根的子树,否则将右子节点入队。

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值