实验9-二叉树

写程序实现教材上算法:二叉树的创建、中序递归遍历、 中序非递归遍历、 中序线索化、中序线索化二叉树的遍历,并写程序验证。

线索化的相关操作太过复杂,是抄的,而且好像有点问题,慎用!

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define STACKINITSIZE 20//栈初始空间大小
#define INCREASEMENT 10//栈空间大小的增量

using namespace std;
typedef char TElemType;

typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

//队列的结构体
typedef BiTree ElemType;
typedef struct LinkNode{
    ElemType data;
    struct LinkNode *next;
}LinkNode;
typedef struct{
    LinkNode *front,*rear;  //  链表头,链表尾,也可以称队头,队尾
}LinkQueue; //先进先出

//算法5.3 按照先序遍历的顺序建立二叉链表
void CreateBiTree(BiTree &T)
{
	TElemType ch;
	cin>>ch;
	if( ch == '#' ) T = NULL;	//递归结束,建空树
	else
	{
		T = new BiTNode;	//生成根节点
		T -> data = ch;		//根节点数据域置为ch
        CreateBiTree(T -> lchild);  //递归创建左子树
        CreateBiTree(T -> rchild); //递归创建右子树
	}
}
//算法5.1 中序遍历的递归算法
void InOrderTraverse(BiTree T)
{
    if(T) //若二叉树非空
    {
        InOrderTraverse(T -> lchild); //中序遍历左子树
        cout<<T -> data<<" "; //访问根节点
        InOrderTraverse(T-> rchild); //中序遍历右子树
    }
}

typedef struct SqStack
{
    BiTNode *base;//栈底指针
    BiTNode *top;//栈顶指针
    int stacksize;//顺序栈空间大小
}SqStack;//定义顺序栈结构
//建立一个空栈,建立成功,返回1,失败,返回0
int InitStack(SqStack &S)
{
    S.base = (BiTNode*)malloc(STACKINITSIZE * sizeof(BiTNode));//20为栈的大小,可以更改
    if(!S.base)
        return 0;
    S.top = S.base;
    S.stacksize = STACKINITSIZE;
    return 1;
}
//进栈操作
int Push(SqStack &S,BiTNode e)
{
    if(S.top - S.base >= S.stacksize)
    {
        S.base = (BiTNode*)realloc(S.base,(STACKINITSIZE + INCREASEMENT) * sizeof(BiTNode));
        if(!S.base)
            return 0;
        S.stacksize = 30;
    }
    *S.top = e;
    S.top ++;
    return 1;
}

//出栈操作,若栈为空,则返回0;栈不为空,则返回1
int Pop(SqStack &S,BiTNode &e)
{
    if(S.base == S.top)
        return 0;
    S.top --;
    e = *S.top;
    return 1;
}

//判断栈是否为空,若栈为空,则返回true,栈不为空,则返回false
bool StackEmpty(SqStack S)
{
    if(S.base == S.top)
        return true;
    else
        return false;
}
//算法5.2 中序遍历的非递归算法
int aInOrderTraverse(BiTree T)
{
    if(!T)
        return 0;
    SqStack S;
    int n = InitStack(S);//建立空栈
    if(!n)
        return 0;
    BiTree p = T;
    BiTNode e;//二叉树节点,用于存放从栈中取出的节点
    while(p || !StackEmpty(S))
    {
        if(p)
        {
            Push(S,*p);
            p = p->lchild;
        }
        else
        {
            Pop(S,e);
            printf("%c ",e.data);
            p = e.rchild;
        }
    }
    printf("\n");
    return 1;
}
/*
建树输入梳理:
a 建立根节点
b 建立左子树根节点
# 表示左子树的左子树为空树
# 表示右子树的右子树为空树
c 建立右子树根节点
# 表示右子树的左子树为空树
# 表示右子树的右子树为空树
*/


//线索化
using namespace std;
typedef struct BiThrNode
{
    char data;
    struct BiThrNode *lchild,*rchild;
    int LTag,RTag;
} BiThrNode,*BiThrTree;
BiThrNode *pre=new BiThrNode;
void CreateBiTree(BiThrTree &T)
{
    char ch;
    cin >> ch;
    if(ch=='#')
        T=NULL;
    else
    {
        T=new BiThrNode;
        T->data=ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}
void InThreading(BiThrTree root)/* 对root所指的二叉树进行中序线索化,其中pre始终指向刚访问过的结点,其初值为NULL*/
{
    if (root!=NULL)
    {
        InThreading(root->lchild);  /* 线索化左子树 */
        if (root->lchild==NULL)/*没有左孩子指向前驱*/
        {
            root->LTag=1;
            root->lchild=pre->rchild;  /*置前驱线索 */
        }
        if (pre!=NULL&&pre->rchild==NULL)  /* 置后继线索 */
        {
            pre->rchild=root;
            pre->RTag=1;
        }
        pre=root;
        InThreading(root->rchild);  /*线索化右子树*/
    }
}
BiThrNode * InNext(BiThrNode *p)
/*在中序线索二叉树中查找p的中序后继结点,并用next指针返回结果*/
{
    BiThrNode *Next;
    BiThrNode *q;
    if (p->RTag==1)
        Next=p->rchild;  /*直接利用线索*/
    else
    {
        /*在p的右子树中查找"最左下端"结点*/
        if(p->rchild!=NULL)
        {
            for(q=p->rchild; q->LTag==0 ; q=q->lchild);
            Next=q;
        }
        else
            Next = NULL;
    }
    return Next;
}
BiThrNode* TinFirst(BiThrTree root)
{
    BiThrNode *q=root;
    q=root;
    if(q)
        while(q->lchild!=NULL)/*找左子树的左子树。。。*/
            q=q->lchild;
    return q;
}
void InOrderTraverse_Thr(BiThrTree root)
{
    BiThrNode *p;
    p=TinFirst(root);/*找到第一个结点*/
    while(p!=NULL)
    {
        printf("%c ",p->data);
        p=InNext(p);
    }
}
void ThreadMain()
{
    pre->RTag=1;
    pre->rchild=NULL;
    BiThrTree tree;
    cout<<"可输入:abd##e##cf##g##建立线索化二叉树"<<endl;
    CreateBiTree(tree);
    InThreading(tree);
    cout<<"中序线索化遍历二叉树"<<endl;
    InOrderTraverse_Thr(tree);
}

int main()
{
    BiTree T;
    cout<<"可输入:abd##e##cf##g##"<<endl;
    CreateBiTree(T);	//使层次遍历顺序为abcdefg需要输入:abd##e##cf##g##
    cout<<"中序遍历二叉树"<<endl;
    InOrderTraverse(T);	//递归中序遍历
    cout<<"非递归中序遍历二叉树"<<endl;
    aInOrderTraverse(T);
	
	ThreadMain();	//线索化主操作
	
    return 0;
}
可输入:abd##e##cf##g##
abd##e##cf##g##
中序遍历二叉树
d b e a f c g 非递归中序遍历二叉树
d b e a f c g
可输入:abd##e##cf##g##建立线索化二叉树
abd##e##cf##g##
中序线索化遍历二叉树
d b e a c g

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/599242.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Android]国内流行的应用市场

国内应用市场的特点 由于Google Play商店服务国内不可用&#xff0c;有许多其它的应用商店充当Android应用的分发渠道。这些商店通常由中国的主要科技公司运营&#xff0c;每个商店都有自己的运营策略和用户基础。 全球移动供应商市场份额&#xff1a;https://gs.statcounter…

我独自升级崛起PC下载安装教程 我独自升级崛起PC下载教程

《我独自升级&#xff1a;崛起》这款游戏灵感源自热门网络漫画《我独自升级》&#xff0c;是一款深度浸入式RPG游戏。它不仅呈献给玩家一个情节错综复杂、引人入胜的故事线&#xff0c;让玩家能紧随主角步伐&#xff0c;亲历其成长的点点滴滴&#xff0c;还自豪地展示了琳琅满目…

geojson文件规格

geojson文件示例&#xff0c; {"type": "FeatureCollection","features": [{"type": "Feature","geometry": {"type": "Point","coordinates": [102.0, 0.5]},"properties&q…

RT-DETR-20240507周更说明|更新Inner-IoU、Focal-IoU、Focaler-IoU等数十种IoU计算方式

RT-DETR改进专栏|包含主干、模块、注意力、损失函数等改进 专栏介绍 本专栏包含模块、卷积、检测头、损失等深度学习前沿改进,目前已有改进点70&#xff01;每周更新。 20240507更新说明&#xff1a; ⭐⭐ 更新CIoU、DIoU、MDPIoU、GIoU、EIoU、SIoU、ShapeIou、PowerfulIoU、…

聚乙烯醇(PVA)纳米纤维膜的性能介绍

聚乙烯醇&#xff08;PVA&#xff09;纳米纤维膜是一种由聚乙烯醇&#xff08;PVA&#xff09;分子组成的纳米级薄膜。这种材料具有许多优良的性能和应用前景&#xff0c;具体如下&#xff1a; 制备工艺&#xff1a;聚乙烯醇纳米纤维膜可以通过静电纺丝等方法制备。具体步骤包括…

网络知识点之—QoS

QoS&#xff08;Quality of Service&#xff0c;服务质量&#xff09;指一个网络能够利用各种基础技术&#xff0c;为指定的网络通信提供更好的服务能力&#xff0c;是网络的一种安全机制&#xff0c; 是用来解决网络延迟和阻塞等问题的一种技术。QoS的保证对于容量有限的网络来…

5000A信号发生器使用方法

背景 gnss工作需要使用的5000A&#xff0c;所以做成文档&#xff0c;用于其他员工学习。 下载星历数据 https://cddis.nasa.gov/archive/gnss/data/daily/2024/brdc/ 修改daily中的年份&#xff0c;就可以获取相关截至时间的星历数据 brcd数据格式 第一行记录了卫星的PRN号&a…

科创板门槛升级!解析中国量子企业的上市之路与国际比拼

4月30日晚&#xff0c;中国证监会于发布了修订后的《科创属性评价指引&#xff08;试行&#xff09;》&#xff08;以下简称“新指引”&#xff09;&#xff0c;该指引自发布日起正式生效。本次修订对原有指引中的部分标准进行了调整&#xff0c;具体如下&#xff1a; 1&#x…

远程桌面连接不上,远程桌面连接不上的专业解决策略

在信息技术领域&#xff0c;远程桌面连接是一种非常重要的工具&#xff0c;它允许用户从任何地点、任何时间访问和操作远程计算机。然而&#xff0c;当远程桌面连接出现问题时&#xff0c;可能会严重影响工作效率。以下是一些可能导致远程桌面连接不上的原因以及相应的解决方案…

干货分享-策划人都在用的活动策划网站

职场上&#xff0c;学会借力&#xff0c;学会‘抄’&#xff0c;比辛辛苦苦做老黄牛&#xff0c;更能事倍功半&#xff0c;不仅自己省事省力&#xff0c;还能获得更多升职加薪的机会。 那么&#xff0c;职场新人如何快速的写出一份领导满意的方案&#xff1f; 今天分享的‘抄…

深度学习之基于Vgg19预训练卷积神经网络图像风格迁移系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在数字艺术和图像处理领域&#xff0c;图像风格迁移技术一直备受关注。该技术可以将一幅图像的内容和…

动态内存开辟(下)

前言 动态内存开辟以及柔性数组的介绍 一、 几个经典的笔试题 1. 题目一 void Getmemory(char*p) {p (char*)malloc(100); } int main() {char* str NULL;Getmemory(str);strcpy(str, "hello world");printf(str);return 0; } 这段代码我们可以发现两个很明显…

解决VScode -正在本地下载 VS Code 服务器

不知道怎么回事再次连接服务器的时候一直卡在这里了&#xff0c;查看输出信息发现一直卡在下载处&#xff0c;报错信息如图1&#xff0c;输出信息如图2。 1.报错信息 图1 报错信息 图2 输出信息 2.尝试 【已解决】设置SSH主机&#xff1a;VS Code-正在本地下载 VS Code 服务器…

Linux 第二十二章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

为何大学计算机专业以C语言入门?探究C语言入门的好处

为何大学计算机专业以C语言入门&#xff1f;探究C语言入门的好处 在大学计算机专业中&#xff0c;C语言常作为入门语言&#xff0c;这并非偶然。C语言具有一些独特的优势&#xff0c;使其成为计算机科学教育中的理想选择。本文将探讨为何大学计算机专业选择以C语言入门&#xf…

Terraform资源

资源是Terraform中最核心的部分&#xff0c;使用Terraform的目的就是用于管理资源。 在Terraform中&#xff0c;资源使用resource块定义。 一个resource可以定义一个或多个基础设施资源对象&#xff0c;如&#xff1a;VPC&#xff0c;虚拟机&#xff0c;DNS记录&#xff0c;Con…

为什么都喜欢用串口通讯?那为什么还用RS485,SPI和I2C?

1、为什么都喜欢用串口通讯&#xff1f; 之前在做单片机产品的时候&#xff0c;用的最多的就是串口通讯&#xff0c;凡是单片机的外设&#xff0c;优先选用带串口功能的&#xff0c;比如蓝牙模块&#xff0c;WIFI模块&#xff0c;4G模块&#xff0c;电表和显示屏等等。 为什么都…

mysql的数据结构及索引使用情形

先来说下数据的一般存储方式&#xff1a;内存(适合小数据量)、磁盘(大数据量)。 磁盘的运转方式&#xff1a;速度 旋转&#xff0c;磁盘页的概念&#xff1a;每一页大概16KB。 1、存储结构 哈希 是通过hash函数计算出一个hash值的&#xff0c;哈希的优点就是查找的时间复杂度…

直说了,你可能从没真正理解MPLS

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 你们好&#xff0c;我的网工朋友。 尽管 MPLS 技术已经相当成熟&#xff0c;有关它的文章数不胜枚举&#xff0c;涵盖了从基本原理到 SR-MPLS 等…

Spring Boot集成RabbitMQ-之6大模式总结

A.集成 一&#xff1a;添加依赖 在pom.xml文件中添加spring-boot-starter-amqp依赖&#xff0c;以便使用Spring Boot提供的RabbitMQ支持&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp&…
最新文章