11.对于每一个元素值为x的阶段,删去以他为根的子树并释放相应的空间

#include <stdio.h>
//删除以x元素为根的所有子树

void Del_x(Bitree bt) //后序遍历删除以bt为根的子树
{
    if(bt)
    {
        Del_x(bt->lchild);
        Del_x(bt->rchlid);
        free(bt);
    }
}

//在二叉树上查找所有以x为元素值的结点,并删除以其为根的子树
void Search_x(Bitree bt,Elempty x)
{
    Bitree Q[]; //Q是存放二叉树结点指针的队列。容量足够大
    if(bt) //在树非空的情况下进行
    {
        if(bt->data==x) //若根结点的值为x,则删除整棵树
        {
            Del_x(bt);
            exit(0);
        }
        InitQueue(Q);
        EnQueue(Q,bt);
        while(!IsEmpty(Q))
        {
            DeQueue(Q,p); //删除队头元素,并用p返回
            if(p->lchild) //如果右子树不空
            {
               if(p->lchild->data==x) //左子树符合删除左子树
                {
                    Del_x(p->lchild);
                    p->lchild==NULL;
                }
               else
                EnQueue(Q,p->lchild);  //父节点的左子女置空
            }
           if(p->rchild) //如果右子树不空
           {
               if(p->rchild->data==x)
                {
                    Del_x(p->rchild);
                    p->rchild=NULL;
                }
                else
                    EnQueue(Q,p->rchlid);
           }

        }
    }
}
View Code

 

posted @ 2019-10-04 22:46  小孢子  阅读(461)  评论(0编辑  收藏  举报