当前位置: 首页 > news >正文

删除二叉树中以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);//入队 }} } 
} 


http://www.mrgr.cn/news/40129.html

相关文章:

  • Java常用三类定时器快速入手指南
  • 2024/9/30 英语每日一段
  • 数据结构之链表(2),双向链表
  • Python的异步编程
  • HTML+CSS基础 第二季课堂笔记
  • 【d56】【sql】完成sql 7题目
  • 读代码UNET
  • CSV数据行(取值)的列数多于表头字段数-Pandas无法正常读取
  • 鸿蒙开发(NEXT/API 12)【状态查询与订阅】手机侧应用开发
  • 如何给一张图像判断失真类型?
  • 【Kubernetes】常见面试题汇总(四十七)
  • (c++)内存四区:1.代码区2.全局区(静态区)3.栈区4.堆区
  • 使用 SSH 连接 Docker 服务器:IntelliJ IDEA 高效配置与操作指南
  • BSS是什么
  • FastAPI: websocket的用法及举例
  • 基于ESP8266—AT指令连接阿里云+MQTT透传数据(3)
  • JavaSE总结
  • cas5.3统一登录前后端分离改造方案(源码)
  • MKV转MP4丨FFmpeg的简单命令使用——视频格式转换
  • 为什么要配置环境变量?