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

在中序线索树中找到数据域A,并在其左子树中插入数据域为x的结点

有中序线索树T,结点形式为:(lchild,ltag,rchild,rtag,data),编写非递归算法找到数据域为A的结点,并在其左子树中插入数据域为x的结点

思想:利用线索二叉树的遍历方法找到数据域为A的结点。

如果A没有左孩子,将新插入的结点作为A的左孩子。将x的前驱为A的前驱,x的后继为A.

如果A有左孩子,设置x的左孩子为A的左孩子,设置x为A的左孩子,设置x的后继为A,设置x左孩子的最右侧结点的后继为x。

代码:

//求中序线索二叉树的中序序列下的第一个结点 
ThreadNode *FirstNode(ThreadNode *p){
	while(p->ltag==0) p=p->lchild;
	return p; 
}

//求中序线索二叉树的结点p的中序序列下的后继
ThreadNode *nextNode(ThreadNode *p){
	if(p->rtag==0) return FirstNode(p->rchild);//右子树的最左下结点
	else return p->rchild;//直接返回后继线索 
}

//找到数据域为A的结点 
ThreadNode *findNode(ThreadNode A,ElemType A){
	ThreadNode *r;//辅助结点
	for(r=FirstNode(T);r->data!=A;r=nextNode(r)) ;//从中序第一个元素开始找元素A 
	return r;
} 

//将x作为数据域为A的结点的左孩子,并保持线索化
void insertx(ThreadNode T,ElemType A,ThreadNode *x){
	ThreadNode *p=findNode(T,A);//找到数据域为A的结点
	if(p->ltag) {//p没有左孩子 
		x->ltag=true;
		x->lchild=p-lchild;
	}else{
		x->ltag=false;//p有左孩子 
		x->lchild=p-lchild;
		ThreadNode *s=x->lchild;//暂存x的左孩子
		while(s->rtag==0){//找到x的左孩子的最右结点 
			s=s->rchild;
		} 
		s->rchild=x;//设置这个最右结点的后继为x 
	} 
	p->lchild=x;//p的左孩子修改为x
	p->ltag=false;
	
	x->rtag=true;//x的后继修改为p 
	x->rchild=p; 
} 


http://www.kler.cn/news/331125.html

相关文章:

  • Java JUC(三) AQS与同步工具详解
  • 机器学习【教育领域及其平台搭建】
  • 用好AI告别灵感枯竭!如何用300个选题提示词打造病毒式内容?
  • Python笔记 - 函数、方法和类装饰器
  • react-问卷星项目(4)
  • Django一分钟:DRF模型序列化器处理关联关系的示例与注意事项
  • 高校实训产品:动漫和游戏场景AI实训平台建设方案
  • 《Spring Boot应用进阶:打造优雅的错误处理机制与全局异常拦截器》
  • 如何在 Flutter 中实现可拖动的底部弹出框
  • 滚雪球学MySQL[7.2讲]:MySQL安全策略详解:数据加密与SQL注入防护
  • 网安学习(js漏洞挖掘)
  • 登录功能开发 P167重点
  • 每日一练:零钱兑换
  • ScatterAdd算子实现简介
  • 【Android】【bug】ImageView设置scaleType不生效的问题
  • 毕业设计选题:基于ssm+vue+uniapp的教学辅助小程序
  • 十进制转十六进制 ← Python字符串
  • 【Spring】Spring Boot项目创建和目录介绍
  • 计算机毕业设计 基于Python的无人超市管理系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档
  • C#/.NET/.NET Core技术前沿周刊 | 第 7 期(2024年9.23-9.30)