树与二叉树---数据结构

news2025/1/16 16:01:29

 树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:

1)树的根结点没有前驱,除根结点外的所有结点有 且只有一个前驱。

2)树中所有结点可以有零个或多个后继。

树结点数据结构

 满二叉树和完全二叉树

注意

完全二叉树,从左到右依次排,没有缺漏

二叉树的顺序存储

二叉树的层次遍历实战

项目结构

function.h文件

#ifndef LEARN_FUNCTION_H
#define LEARN_FUNCTION_H
#include <stdio.h>
#include <stdlib.h>
typedef char BiElemType;
typedef struct BiNode{
    BiElemType c;
    struct BiNode *lchild;
    struct BiNode *rchild;
}BiNode, *BiTree;
//tag结构体是辅助队列使用的
typedef struct tag{
    BiTree p;//树的某一个结点的地址值
    struct tag *pnext;
}tag_t, *ptag_t;
#endif //LEARN_FUNCTION_H

main.cpp文件

calloc

  • 申请的空间大小是两个参数直接相乘,并对空间进行初始化,赋值为0,
  • 头文件#include <stdlib.h>
#include "function.h"


int main(){
    BiTree pnew;
    char c;
    BiTree tree = NULL;
    ptag_t  phead = NULL,ptail = NULL,listpnew = NULL,pcur;
    while(scanf("%c",&c)){
        if(c == '\n'){
            break;//读到换行就结束
        }
        //calloc申请的空间大小是两个参数直接相乘,并对空间进行初始化,赋值为0,头文件#include <stdlib.h>
        pnew = (BiTree)calloc(1, sizeof(BiNode));
        pnew -> c = c;
        listpnew = (ptag_t) calloc(1,sizeof(tag_t));//给队列结点申请空间
        if(NULL == tree){
            tree = pnew;//tree指向树的根结点
            phead = listpnew;//第一个结点即是队列头,也是队列尾
            ptail = listpnew;//
            pcur = listpnew;//pcur要指向要进入树的父亲元素
        }else{
            //让元素先入队列
            ptail -> pnext = listpnew;
            ptail = listpnew;
            //接下来把b结点放入树中
            if(NULL == pcur -> p -> lchild){
                pcur -> p -> lchild = pnew;//pcur -> p左孩子为空,就放入左孩子
            }else if(NULL == pcur -> p -> rchild){
                pcur -> p -> rchild = pnew;//pcur -> p右孩子为空,就放入右孩子
                pcur = pcur -> pnext;//当前结点左右孩子都有了,pcur就指向下一个
            }
        }
    }
    return 0;
}

二叉树的前序中序后序遍历

代码

main.cpp文件

#include "function.h"

//前序遍历,也叫先序遍历,也是深度优先遍历
void PreOrder(BiTree p){
    if(p != NULL){
    printf("%c",p -> c);
    PreOrder(p -> lchild);//打印左子树
    PreOrder(p -> rchild);//打印右子树
    }
}

//中序遍历
void InOrder(BiTree p){
    if(p != NULL){
    InOrder(p -> lchild);//打印左子树
    printf("%c",p -> c);
    InOrder(p -> rchild);//打印右子树
    }
}

//后序遍历
void PostOrder(BiTree p){
    if(p != NULL){
    PostOrder(p -> lchild);//打印左子树
    v(p -> rchild);//打印右子树
    printf("%c",p -> c);
    }
}

int main(){
    BiTree pnew;
    char c;
    BiTree tree = NULL;
    ptag_t  phead = NULL,ptail = NULL,listpnew = NULL,pcur;
    while(scanf("%c",&c)){
        if(c == '\n'){
            break;//读到换行就结束
        }
        //calloc申请的空间大小是两个参数直接相乘,并对空间进行初始化,赋值为0,头文件#include <stdlib.h>
        pnew = (BiTree)calloc(1, sizeof(BiNode));
        pnew -> c = c;
        listpnew = (ptag_t) calloc(1,sizeof(tag_t));//给队列结点申请空间
        if(NULL == tree){
            tree = pnew;//tree指向树的根结点
            phead = listpnew;//第一个结点即是队列头,也是队列尾
            ptail = listpnew;//
            pcur = listpnew;//pcur要指向要进入树的父亲元素
        }else{
            //让元素先入队列
            ptail -> pnext = listpnew;
            ptail = listpnew;
            //接下来把b结点放入树中
            if(NULL == pcur -> p -> lchild){
                pcur -> p -> lchild = pnew;//pcur -> p左孩子为空,就放入左孩子
            }else if(NULL == pcur -> p -> rchild){
                pcur -> p -> rchild = pnew;//pcur -> p右孩子为空,就放入右孩子
                pcur = pcur -> pnext;//当前结点左右孩子都有了,pcur就指向下一个
            }
        }
    }
    printf("--------PreOrder--------\n");
    PreOrder(tree);
    printf("--------InOrder--------\n");
    InOrder(tree);
    printf("--------PostOrder--------\n");
    PostOrder(tree);
    return 0;
}

 二叉树的层序遍历

注意:

层序遍历,又称广度优先遍历;而层次遍历中的前序遍历又称深度优先遍历。

项目结构

function.h文件

#ifndef LEARN_FUNCTION_H
#define LEARN_FUNCTION_H
#include <stdio.h>
#include <stdlib.h>
typedef char BiElemType;
typedef struct BiNode{
    BiElemType c;
    struct BiNode *lchild;
    struct BiNode *rchild;
}BiNode, *BiTree;

//tag结构体是辅助队列使用的
typedef struct tag{
    BiTree p;//树的某一个结点的地址值
    struct tag *pnext;
}tag_t, *ptag_t;

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

void InitQueue(LinkQueue &Q);
bool IsEmpty(LinkQueue Q);
void EnQueue(LinkNode &Q,ElemType x);
bool DeQueue(LinkNode &Q,E;emType &x);


#endif //LEARN_FUNCTION_H

CMakeList.txt文件

里面的内容自动生成

queue.cpp文件

#include "function.h"

//初始化队列
void InitQueue(LinkQueue &Q){
        Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));//头和尾指向同一个结点
        Q.front -> next = NULL;//头结点的next指针为NULL
}

//判断队列是否为空
bool IsEmpty(LinkNode Q){
    return Q.rear == Q.front;
}
 
//入队
void EnQueue(LinkQueue &Q,ElemType x){
    LinkNode *pnew = (LinkNode*) malloc(sizeof(LinkNode));
    pnew -> data = x;
    pnew -> next =NULL;//要让next为NULL;
    Q.rear -> next = pnew;//尾指针的next指向pnew,因为从尾部入队
    Q.rear = pnew;//rear要指向新的尾部
}
 
 
bool DeQueue(LinkQueue &Q,ElemType &x){
    if(Q.rear == Q.front){//队列为空
        return false;
    }
    LinkNode* q = Q.front -> next;//拿到第一个结点,存入q
    x = q -> data;//获取要出对的元素值
    Q.front -> next = q->next;//让第一个结点断链
    if(Q.rear == q){//链表只剩余一个结点时,被删除后,要改变rear
        Q.rear = Q.front;
    }
    free(q);
    return true;
}

main.cpp文件

#include "function.h"

//层次遍历,层序遍历,广度优先遍历
void LevelOrder(BiTree T){
    LinkQueue Q;//辅助队列
    InitQueue(Q);//初始化队列
    BiTree p;
    EnQueue(Q,T);//树根入队
    while(!IsEmpty(Q)){
        DeQueue(Q,p);//出队当前结点并打印
        putchar(p->c);
        if(p->lchild!=NULL){//入队左孩子
            EnQueue(Q,p->lchild);
        }
        if(p->rchild!=NULL){ //入队右孩子
            EnQueue(Q,p->rchild);
        }
    }
}

//层次建树
int main(){
    BiTree pnew;//用来指向新申请的树结点
    char c;
    BiTree tree=NULL;//树根
    //phead 就是队列头,ptail 就是队列尾
    ptag_t phead=NULL,ptail=NULL,listpnew=NULL,pcur=NULL;
    //输入内容为 abcdefghij
    while(scanf("%c",&c)){
        if(c=='\n'){
            break;
        }
        pnew=(BiTree)calloc(1,sizeof(BiTNode));//calloc 申请空间并对空间进行初始化,赋值为 0
        pnew->c=c;//数据放进去
        listpnew=(ptag_t)calloc(1,sizeof(tag_t));//给队列结点申请空间
        listpnew->p=pnew;
        if(NULL==tree){
            tree=pnew;//树的根
            phead=listpnew;//队列头
            ptail=listpnew;//队列尾
            pcur=listpnew;
            continue;
        }else{
            ptail->pnext=listpnew;//新结点放入链表,通过尾插法
            ptail=listpnew;//ptail 指向队列尾部
        }//pcur 始终指向要插入的结点的位置
        if(NULL==pcur->p->lchild)//如何把新结点放入树{
            pcur->p->lchild=pnew;//把新结点放到要插入结点的左边
        }else if(NULL==pcur->p->rchild){
            pcur->p->rchild=pnew;//把新结点放到要插入结点的右边
            pcur=pcur->pnext;//左右都放了结点后,pcur 指向队列的下一个
        }
    }
    PostOrder(tree);
    printf("\n--------层次遍历-----------\n");
    LevelOrder(tree);
    printf("\n");
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

洛谷使用指南

详细看——洛谷的规则 1.注册账号 1.打开洛谷首页 这样就对了&#xff01;&#xff01;&#xff01; 2.点击注册 当显示以上页面时表示进入了注册页面。 3.登录 当注册好后就可以登陆了。 当显示以上页面时表示进入了登录页面。 2.题库使用 当单击题库后&#xff0c;会出…

算法练习-二叉搜索树中的搜索(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;二叉树 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨…

二、OpenAI开发者快速入门

启动并运行OpenAI API OpenAI API 为开发者提供一个简单的接口&#xff0c;使其能够在他们的应用中创建一个智能层&#xff0c;由OpenAI最先进的模型提供支持。聊天补全端点为ChatGPT提示支持&#xff0c;一种简单的方法是&#xff1a;输入文本&#xff0c;使用GPT-4模型输出。…

在JSP中实现JAVABEAN

在JSP中实现JAVABEAN 问题陈述 创建Web应用程序以连接数据库并检索作者名、地址、城市、州及邮政编码等与作者的详细信息。JavaBean组件应接受作者ID、驱动程序名及URL作为参数。信息要从authors表中检索。 解决方案 要解决上述问题,需要执行以下任务: 创建Web应用程序。创…

macbookair怎么清理内存 ?如何利用 CleanMyMac X 进行系统清理

macbookair怎么清理内存 清理MacBook Air的内存可以通过以下几种方法&#xff1a; 优化储存空间。在MacBook Air上&#xff0c;可以通过“优化储存空间”来释放空间。这包括将文件储存在iCloud中&#xff0c;如桌面、文稿和iCloud信息&#xff0c;以及自动移除在iCloud中观看…

Lombok 高级说明

优质博文&#xff1a;IT-BLOG-CN 一、痛点 【1】代码臃肿&#xff1a;POJO中的getter/setter/equals/hashcode/toString等&#xff1b; 【2】样板式代码&#xff1a;I/O流的关闭操作等&#xff1b; Lombok是一个可以通过注解简化Java代码开发的工具&#xff0c;能够在我们编…

2.8日学习打卡----初学RabbitMQ(三)

2.8日学习打卡 一.springboot整合RabbitMQ 之前我们使用原生JAVA操作RabbitMQ较为繁琐&#xff0c;接下来我们使用 SpringBoot整合RabbitMQ&#xff0c;简化代码编写 创建SpringBoot项目&#xff0c;引入RabbitMQ起步依赖 <!-- RabbitMQ起步依赖 --> <dependency&g…

关节点检测

https://www.bilibili.com/video/BV19g4y1777q/?p2&spm_id_frompageDriver 关节点检测全流程 YOLO:单阶段&#xff0c;快&#xff1b; MMPose&#xff1a;双阶段&#xff0c;准&#xff1b; 标注工具Labelme 用Labelme标注样本数据集

利用Pybind11封装Python版的WiringPi!

原版的WiringPi是一个用于树莓派的GPIO库&#xff0c;用C语言开发&#xff0c;仓库地址&#xff1a;https://github.com/WiringPi/WiringPi。该库允许用户以编程方式访问和控制树莓派的GPIO引脚。而随着Python在嵌入式设备上的快速发展&#xff0c;其对底层引脚的操作也变得越来…

OpenAI给DALL-E 3来了个新动作,加入了全新水印技术

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

老胡的周刊(第128期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 coze-discord-proxy[2] 代理 Discord-Bot 对…

018 Linux

文章目录 操作系统定义分类Linux系统构成 Linux文件系统Linux常用命令基础操作命令文件操作压缩解压权限管理显示展示命令其他命令 vi编译器操作使用 添加用户基本概念用户管理命令 ubuntu软件安装ssh服务终端启动Python服务 操作系统 定义 操作系统是管理计算机硬件与软件资…

【超高效!保护隐私的新方法】针对图像到图像(l2l)生成模型遗忘学习:超高效且不需要重新训练就能从生成模型中移除特定数据

针对图像到图像生成模型遗忘学习&#xff1a;超高效且不需要重新训练就能从生成模型中移除特定数据 提出背景如何在不重训练模型的情况下从I2I生成模型中移除特定数据&#xff1f; 超高效的机器遗忘方法子问题1: 如何在图像到图像&#xff08;I2I&#xff09;生成模型中进行高效…

archlinux 使用 electron-ssr 代理 socks5

提前下载好 pacman 包 https://github.com/shadowsocksrr/electron-ssr/releases/download/v0.2.7/electron-ssr-0.2.7.pacman 首先要有 yay 和 aur 源&#xff0c;这个可以参考我之前的博客 虚拟机内使用 archinstall 安装 arch linux 2024.01.01 安装依赖 yay 安装的&#…

堆排序----C语言数据结构

目录 引言 堆排序的实现**堆的向下调整算法** 对排序的时间复杂度建堆的时间复杂度&#xff1a;排序过程的时间复杂度&#xff1a;总体时间复杂度&#xff1a; 引言 堆排序&#xff08;Heap Sort&#xff09;是一种基于比较的排序算法&#xff0c;利用堆的数据结构来实现。它的…

数据湖的整体思路

湖本质上是一个集中化&#xff0c;中心化的&#xff0c;一体化的存储技术&#xff0c;并且在其之上追求技术架构的统一化&#xff0c;如流批一体&#xff0c;服务分析一体化。 当数据湖成为中心&#xff0c;那么就可以围湖而建“数据服务环”&#xff0c;环上的服务包括了数仓、…

基于tomcat运行jenkins常见的报错处理

目录 1.jenkins.util.SystemProperties$Listener错误 升级jdk11可能遇到的坑 2.java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration 3.There were errors checking the update sites: UnknownHostException:updates.jenkins.i…

JAVA Web 学习(五)Nginx、RPC、JWT

十二、反向代理服务器——Nginx 支持热部署&#xff0c;几乎可以做到 7 * 24 小时不间断运行&#xff0c;即使运行几个月也不需要重新启动&#xff0c;还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量&#xff0c;其占用内存少、并发能力强、能支持…

初识Solidworks:我的第一份作业的感想

从来没用CAD软件画过机械设计图。但我脑子里有一种概念&#xff0c;无非就是把尺规作图软件化&#xff0c;更方便画图、更方便修改、更方便打印一些。但第一份 Solidworks 作业就颠覆了我的认知&#xff0c;考虑到这个软件的上市时间&#xff0c;让我意识到自己对 CAD 软件的认…

【大厂AI课学习笔记】【1.5 AI技术领域】(8)文本分类

8,9,10&#xff0c;将分别讨论自然语言处理领域的3个重要场景。 自然语言处理&#xff0c;Natual Language Processing&#xff0c;NLP&#xff0c;包括自然语言识别和自然语言生成。 用途是从非结构化的文本数据中&#xff0c;发掘洞见&#xff0c;并访问这些信息&#xff0…