假设二叉树采用连接方式存储,编写一个对二叉树进行前序遍历的递归和非递归程序
更新时间:2023-07-20 13:50:01 阅读量: 实用文档 文档下载
- 假设在一棵二叉树推荐度:
- 相关推荐
#include "iostream.h"
#include "string.h"
#include "malloc.h"
#include "stdio.h"
typedef struct btree
{
int data;//树结点的值域
int ltag,rtag;//树结点的左右线索
struct btree *left,*right;//树结点的左右指针,ltag,rtag=1时指向前驱和后继,否则指向左右孩子
}node;
node *SearchNode(node *q,node *r)
{//在根结点地址为q的中序线索二叉树中查找结点r将要插入的结点
node *p;
p=q;
while(1)
{
while(r->data<p->data&&p->ltag!=1){p=p->left;}//一直向左寻找
while(r->data>p->data&&p->rtag!=1){p=p->right;}//一直向右寻找
if(r->data<p->data&&p->ltag==1||r->data>p->data&&p->rtag==1||r->data==p->data)break; //当r->data<p->data并且p没有左孩子或r->data>p->data并且p没有由孩子 //或r->data==p->data时,结点p找到,跳出循环
}
return(p);//返回p结点
}
node *InsertNode(node *rot,node *s)
{//在根结点地址为rot的中序线索二叉树中插入结点s
node *p;
if(rot==NULL)
{//如果根结点为空,s结点作为根结点插入。
rot=s;
rot->data=s->data;
rot->ltag=1;
rot->left=NULL;
rot->rtag=1;
rot->right=NULL;
return(rot);
}
p=SearchNode(rot,s);//调用SearchNode函数查找s将要插入的结点p的位置
if(s->data==p->data)
{//如果结点在树中已经存在,释放该结点并返回
free(s);
return(rot);
}
if(s->data<p->data)
{//如果s->data<p->data,则做为p的左孩子插入,此时s的前驱是插入前p的前驱,s的后继是p
s->ltag=1;
s->left=p->left;
s->rtag=1;
s->right=p;
p->ltag=0;
p->left=s;
}
if(s->data>p->data)
{//如果s->data>p->data,则做为p的右孩子插入,此时s的后继是插入前p的后继,s的前驱是p
s->rtag=1;
s->right=p->right;
s->ltag=1;
s->left=p;
p->rtag=0;
p->right=s;
}
return(rot);
}
node *CreatTree(node *rt)
{//以根结点为空开始构造中序线索二叉排序树,并返回根结点的地址
int m;//用于输入根结点的值域
node *q;
while(1)
{
printf("Please input number:\nm=");
//scanf("%d",&m);
cin>>m;//输入结点的值
if(m==-1) return(rt);
node *s;//建一个有待插入的新结点
s=(node *)malloc(sizeof(node));//给s开辟一个结点空间
s->data=m;
q=InsertNode(rt,s);//调用InsertNode函数一个个结点插入已生成的中序线索二叉树中,形成新的树
rt=q;
}
return(rt);
}
node *Search(node *root,int x)
{//在根结点地址为root的中序线索二叉树中查找结点值为x的结点p并返回p,若结点不存在则返回NULL。
node *p;//返回值为x的结点的位置
p=root;
while(1)
{
while(x<p->data&&p->ltag!=1){p=p->left;}
while(x>p->data&&p->rtag!=1){p=p->right;}
if(x<p->data&&p->ltag==1||x>p->data&&p->rtag==1||x==p->data)break;
}
if(x!=p->data) p=NULL;
return(p);
}
node *P_Next(node *root,int x)
{//查找根结点地址为root的中序线索二叉树中结点值为x的结点p按后序遍历的后继结点q node *p,*q;//p是结点值为x的结点,q用来返回p按后序遍历的后继结点
p=Search(root,x);//调用Search函数查找结点p的位置
if(p==NULL)//值为x结点不存在,出错
{
return NULL;
}
if(p->ltag==0) return(p->left);//如果此结点有左孩子,返回左孩子结点
else
{
if(p->rtag==0) return(p->right);//如果此结点无左孩子有右孩子,返回右孩子结点 else//如果此结点为叶子结点
{
q=p->right;//寻找此结点的后继结点
if(q==NULL)//后继为空,此结点是按前序遍历的最后一个结点,返回空 {
printf("this node is last node\n");
return NULL;
}
else
{
while(q->rtag==1&&q->right!=NULL) {q=q->right;}//如果结点的后继没有右孩子,一直向后继方向寻找结点
if(q->right==NULL)
{
return NULL;
}
else return(q->right);//返回结点的右孩子结点
}
}
}
}
void display(node *t)
{//非递归中序遍历中序线索二叉排序树
printf("中序序列为:");
while(t->ltag!=1){t=t->left;}//寻找最左结点,即中序遍历的第一个结点
while(t!=NULL)
{
printf("%d ",t->data);//打印结点值
while(t->rtag==1)//结点右指针指向后继结点
{
t=t->right;
if(t==NULL)return;//t空,遍历结束
else printf("%d ",t->data);//打印结点值
}
if(t->rtag==0)//如果结点有右孩子
{
t=t->right;//从右孩子结点开始
while(t->ltag!=1){t=t->left;}//继续向左寻找此子树的最左结点
}
}
}
int main()
{
int w;
printf("输入一串正整数建立一棵中序线索二叉排序树最后以-1作为结束标志\n"); node *root;
root=NULL;
node *p;
node *q;
p=CreatTree(root);
display(p);
while(1)
{
cout<<"\n查找按前序遍历x的后继结点\nx=";
cin>>w;
q=P_Next(p,w);
if(q==NULL) cout<<"此结点不在树中或是按前序遍历的最后一个结点\n"; else
{
cout<<"\n此结点的后继结点为:";
cout<<q->data;
}
}
}
正在阅读:
假设二叉树采用连接方式存储,编写一个对二叉树进行前序遍历的递归和非递归程序07-20
各种设备重量清单03-18
个人政治学习情况总结01-16
二年级上小小商店_08-07
业务合同、委托合同范本08-12
谈谈初中学生生物学习兴趣的培养03-05
五年级语文课外知识竞赛试题03-11
王越老师销售精英疯狂训练09-15
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 递归
- 遍历
- 行前
- 假设
- 编写
- 采用
- 存储
- 连接
- 方式
- 程序
- 一个
- 【webinar】FY14 Q2工作站新品考试
- 行星齿轮传动机构的设计
- 高中英语语法被动语态练习题
- 锶元素地球化学在水文地质研究中的应用进展
- Hamlet by Shakespeare 哈姆雷特(作者莎士比亚)
- 民族团结主题班会教案
- 每周日都应该自我反省的20个问题
- 姓名常用字五行列表
- 小学三年级语文阅读理解练习题
- 自考市场调查真题答案
- 2010年中考数学模拟试题分类汇编——二次函数
- 电梯前室砖粘贴协议
- 2015年度南车北京时代液压胶管采购招标书
- 第五章 数组和广义表
- 常见运动性疾病防治与康复
- 安徽省亳州一中2012-2013学年高一上学期期中考试化学试卷
- 绿色家具全过程评价规范 金属家具
- 七年级上册历史考试题型训练
- 八年级语文上册 第8课《苏州赋》同步测试(无答案)冀教版
- 201209学期《国际公法》复习纲要一