欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 删除二叉树中以x为根节点的子树(包括根结点)

删除二叉树中以x为根节点的子树(包括根结点)

2025/12/20 18:44:01 来源:https://blog.csdn.net/m0_56332819/article/details/142664740  浏览:    关键词:删除二叉树中以x为根节点的子树(包括根结点)

已知二叉树以二叉链表存储,编写算法完成:对于树中每个元素值为x的结点,删除以它为根的子树,并释放相应的空间。

思想:

删除二叉树采用后序遍历。先删除左子树,然后右子树,最后根。

利用层次遍历来删除所有以x为根结点的子树,并利用队列来进行辅助。不为x,则左右孩子入队,否则删除。直到队列为空。

代码:

void DeleteBTree(BTree T){//删除二叉树,后序遍历 if(T!=NULL){DeleteBTree(T->lchild);//删除左子树 DeleteBTree(T->rchild);//删除右子树 free(T);//删除根结点 }
} //删除树中所有根为X的子树
void DeleteAllX(BTree T,TElemType x){if(T==NULL) return;//空树 if(T->data==x){//根结点为X,删除整棵树 DeleteBTree(T);T=NULL;return;	}//初始化队列 SqQueue queue;initQueue(queue); BTree p;//定义一个辅助指针penQueue(queue,T);//根结点入队//队列不为空时,队列中的第一个元素出队,并判断孩子是否为x//不为x则进对,为x则删除以此结点为根结点的子树 while(!queueEmpty(queue)){deQueue(queue,p);//出队 if(p->lchild != NULL){//做孩子 if(p->lchild->data == x){DeleteBTree(p->lchild);//删除 p->lchild = NULL}else{enQueue(queue,p->lchild);//入队 }} if(p->rchild != NULL){//右孩子 if(p->rchild->data == x) {DeleteBTree(p->rchild);//删除 p->rchild = NULL}else{enQueue(queue,p->rchild);//入队 }} } 
} 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词