数据结构大合集06——树与二叉树的相关函数运算算法

news2024/9/30 11:31:03

函数运算算法合集06

  • 1、树的基本运算
    • 1.1 树的存储结构
      • 1.1.1 双亲存储结构
      • 1.1.2 孩子链存储结构
      • 1.1.3 孩子兄弟链式存储结构
  • 2、二叉树的顺序存储
    • 2.1 二叉树顺序存储的结构体
    • 2.2 顺序存储的基本思路
  • 3、二叉树的链式存储
    • 3.1 二叉树的链式存储的结构体
    • 3.2 链式存储的基本算法
      • 3.2.1 初始化
  • 4、二叉树的先/中/后序遍历
    • 4.1 二叉树的先序遍历
    • 4.2 二叉树的中序遍历
    • 4.3 二叉树的后序遍历
    • 4.4 二叉树的层序遍历

注:
本篇文章的概念合集
数据结构的概念大合集06(树和二叉树)

1、树的基本运算

1.1 树的存储结构

1.1.1 双亲存储结构

双亲存储结构是一种顺序存储结构,用一组连续空间存储树的所有结点,同时在每个节点中附设一个伪指针指示器双亲结点的位置(除头结点以为,每个节点只有唯一的双亲结点,将更结点的双亲结点的位置设置为特殊值-1);
在这里插入图片描述

这种存储结构利用了每个节点(除根节点外)只有唯一双亲的性质。在这种存结构里面,求某个结点的双亲结点非常容易,但是求某个结点的孩子结点时就需要遍历整个存储结构。
//双亲存储结构

//双亲存储结构
typedef struct
{
    ElemType data;  //存放结点的值
    int parent;     //存放双亲的位置
}PTree[MaxSize];

1.1.2 孩子链存储结构

孩子链存储结构,每个结点不仅包含结点值,还包含指向所有孩子结点的指针,为避免由于树中每个结点的子树的个数不同导致算法的实现变化,最好将孩子链存储结构按树的度来设计结点的孩子结点的指针域的个数。请添加图片描述

孩子链存储结构的优点是查找某结点的孩子结点十分方便,其缺点是查找某结点的双亲结点需要遍历数,且当树的度比较大时,存在较多的空指针域。

//孩子链存储结构
typedef struct node
{
    ElemType data;      //结点的值
    struct node *sons[MaxSize];     //指向孩纸结点的指针
}TSonNode;

1.1.3 孩子兄弟链式存储结构

孩子兄弟链式存储结构,是将每个结点设计3个域,即一个数据元素域,一个指向该结点的左边第一个孩子结点的指针域,一个指向结点的下一个兄弟结点的指针域。
其优缺点与孩子链存储结构一样;孩子兄弟链式存储结构还有一个优点就是把该树转化为二叉树的存储结构。

这下来我们来介绍二叉树的相关内容。

//孩子兄弟链存储结构
typedef struct tnode
{
    ElemType data;      //结点的值
    struct tnode * hp; //指向兄弟结点
    struct tnode * vp; //指向孩子结点
}TSBnode;

2、二叉树的顺序存储

2.1 二叉树顺序存储的结构体

让二叉树按照从上之下,从左至右的顺序依次存储各个结点

//二叉树的顺序存储的结构体
typedef struct
{
    ElemType value;  //存放结点的值
    bool isEmpty;     //结点是否为空
}TreeNode[MaxSize];

开发技巧
请添加图片描述

2.2 顺序存储的基本思路

i是结点的编号

  • i 的左孩子 —— 2i
  • i 的右孩子 —— 2i + 1
  • i 的父节点 —— [ i / 2 ]
  • i 所在的层次 ——log2( n + 1 ) 或 log2n + 1

若是完全二叉树中共有n个结点,则

  • 判断 i 是否有左孩子 —— 2i <= n
  • 判断 i 是否有右孩子 —— 2i + 1 <= n
  • 判断 i 是否是叶子/分支节点—— i > [n / 2]

若不是完全二叉树呢?
则将二叉树的结点编号与完全二叉树对应起来,则

  • i 的左孩子 —— 2i
  • i 的右孩子 —— 2i + 1
  • i 的父节点 —— [ i / 2 ]
    但是运用这种方式,如果二叉树的结点较少的话,此思路还是会开辟出一个类似于完全二叉树的内存,这样就会导致大量的内存浪费,比如下面图示
    请添加图片描述
    结论:
    二叉树的顺序存储结构,只适合于存储完全二叉树。

3、二叉树的链式存储

3.1 二叉树的链式存储的结构体

//二叉树的链式存储的结构体
typedef struct BiTNode
{
    ElemType data;      //数据域
    struct BiTNode *lchild, *rchild;  //左,右孩子指针
}BdiTnode, *BiTree;

3.2 链式存储的基本算法

3.2.1 初始化

// 初始化
BiTree root = NULL; // 定义一个指向根结点的指针,
root = (BiTree)malloc(sizeof(BiTNode)); // 分配根节点内存
if (root != NULL) { // 检查分配是否成功
    root->data = 1; // 正确赋值
    root->lchild = NULL;
    root->rchild = NULL;
}
// 插入新结点
BiTNode *p = (BiTNode)malloc(sizeof(BiTNode)); // 分配新节点内存,注意,这里的p也是指针
if (p != NULL) { // 检查分配是否成功
    p->data = 2; // 正确赋值
    p->lchild = NULL;
    p->rchild = NULL;
    root->lchild = p; // 将新节点设置为根的左孩子
}

4、二叉树的先/中/后序遍历

运用二叉树的递归遍历特性确定的次序规则
二叉树的递归特性:

  1. 空二叉树
  2. 由“根节点 + 左子树 + 右子树”组成的二叉树

4.1 二叉树的先序遍历

  1. 若二叉树为空,则什么也不做;
  2. 若二叉树非空:
    访问根节点(可对结点进行部分操作,比如输出结点的data值);
    先序遍历左子树
    先序遍历右子树
//先序遍历
void PreOrder(BiTree T)
{
    if(T != NULL)
    {
        vist(T);                //可以进行部分操作
        PreOrder(T->lchild);    //遍历左子树
        PreOrder(T->rchild)//遍历右子树
    }
}

先序遍历的空间复杂度是O(h)
脑补思路:

  1. 从根结点出发,
  2. 如果左边还有没走的路,则继续走左边,走到尽头就往回走。
  3. 如果左边没路了,就往右边走。
  4. 如果两边都没有路了,就往上走。

4.2 二叉树的中序遍历

  1. 若二叉树为空,则什么也不做;
  2. 若二叉树非空:
    先序遍历左子树
    访问根节点(可对结点进行部分操作,比如输出结点的data值);
    先序遍历右子树
//中序遍历
void InOrder(BiTree T)
{
    if(T != NULL)
    {
        InOrder(T->lchild);    //遍历左子树
        vist(T);                //可以进行部分操作
        InOrder(T->rchild)//遍历右子树
    }
}

脑补思路:

  1. 从根结点出发,
  2. 如果左边还有没走的路,则继续走左边,走到尽头就往回走。
  3. 如果左边没路了,就往右边走。
  4. 如果两边都没有路了,就往上走。

4.3 二叉树的后序遍历

  1. 若二叉树为空,则什么也不做;
  2. 若二叉树非空:
    先序遍历左子树
    先序遍历右子树
    访问根节点(可对结点进行部分操作,比如输出结点的data值);
//后序遍历
void PostOrder(BiTree T)
{
    if(T != NULL)
    {
        PostOrder(T->lchild);    //遍历左子树
        PostOrder(T->rchild)//遍历右子树
        vist(T);                //可以进行部分操作
    }
}

4.4 二叉树的层序遍历

算法思想:

  1. 初始化一个辅助队列
  2. 根节点入队
  3. 若队列非空,则队头节点出队,访问该结点,并将其左、右孩子插入队尾(如果有的话)
//层序遍历
void LeveOrder(BiTree T)
{
    LinkQueue Q;    //定义链队的头结点
    InitQueue(Q);   //初始化链队
    BiTree p;
    EnQueue(Q,T);   //将根结点入队
    while(!IsEmpyty(Q))     //队列不空则进入循环
    {
        DeQueue(Q , p);     //头结点出队
        visit(p);
        if(p->lchild != NULL)
            EnQueue(Q, p->lchild);  //左孩子入队
        if(p->rchild != NULL)
            EnQueue(Q, p->rchild);  //右孩子入队
    }
}

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

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

相关文章

docker镜像复制与常见命令

一、前言 最近通过阿里的镜像仓库远程拉取镜像&#xff0c;发现以前的版本不见了&#xff0c;拉取了最新的镜像&#xff0c;有发现版本不配问题。那么想使用老版本的镜像那就要从别的环境获取。于是就需要进行离线镜像复制&#xff0c;打包&#xff0c;上传&#xff0c;重新导入…

时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测

时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测 目录 时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现BiTCN-GRU双向时间卷积神经网络结…

Tkinter 一文读懂

Tkinter 简介 Tkinter&#xff08;即 tk interface&#xff0c;简称“Tk”&#xff09;本质上是对 Tcl/Tk 软件包的 Python 接口封装&#xff0c;它是 Python 官方推荐的 GUI 工具包&#xff0c;属于 Python 自带的标准库模块&#xff0c;当您安装好 Python 后&#xff0c;就可…

AI新工具(20240322) 免费试用Gemini Pro 1.5;先进的AI软件工程师Devika;人形机器人Apptronik给你打果汁

✨ 1: Gemini Pro 1.5 免费试用Gemini Pro 1.5 Gemini 1.5 Pro是Gemini系列模型的最新版本&#xff0c;是一种计算高效的多模态混合专家&#xff08;MoE&#xff09;模型。它能够从数百万个上下文Token中提取和推理细粒度信息&#xff0c;包括多个长文档和数小时的视频、音频…

R语言逻辑回归与lasso模型

一、数据描述 数据集heart_learning.csv与heart_test.csv是关于心脏病的数据集&#xff0c;heart_learning.csv是训练数据集&#xff0c;heart_test.csv是测试数据集。 变量名称变量说明age年龄sex性别&#xff0c;取值1代表男性&#xff0c;0代表女性pain 胸痛的类型&#x…

SQLiteC/C++接口详细介绍sqlite3_stmt类(十二)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十一&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十三&#xff09; 48、sqlite3_stmt_isexplain sqlite3_stmt_is…

Django日志(四)

一、Filters介绍 过滤器用于从logger传递给handler的哪些日志要做额外控制 默认情况下,满足日志级别的任何消息都将处理。只要级别匹配,任何日志消息都会被处理。不过,也可以通过添加 filter 来给日志处理的过程增加额外条件。例如,可以添加一个 filter 只允许某个特定来源…

手机网页关键词视频爬虫采集软件可导出视频分享链接|视频无水印批量下载工具

全新音视频批量下载工具&#xff0c;为您解放视频管理烦恼&#xff01; 现如今&#xff0c;音上涌现出大量精彩的视频内容&#xff0c;但是要想高效地获取、管理和分享这些视频却是一件颇具挑战的事情。针对这一难题&#xff0c;我们自主研发了全新的音视频批量下载工具&#x…

什么是单点登录?

单点登录&#xff08;Single Sign On&#xff0c;简称 SSO&#xff09;简单来说就是用户只需在一处登录&#xff0c;不用在其他多系统环境下重复登录。用户的一次登录就能得到其他所有系统的信任。 为什么需要单点登录 单点登录在大型网站应用频繁&#xff0c;比如阿里旗下有淘…

B-tree - 深度解析+C语言实现+opencv绘图助解

B-tree - 深度解析C语言实现opencv绘图助解 1. 概述2. B-tree介绍3. Btree算法实现3.1 插入3.1.1 排序3.1.2 分裂1) 叶子节点的分裂2) 根节点的分裂&#xff08;特殊的分裂&#xff09;3) 内节点的分裂 3.2 删除3.2.1 再平衡&#xff08;Rebalance&#xff09;左旋右旋合并 3.2…

蓝桥杯 2022 省B 积木画

这是个典型的动态规划问题&#xff0c;重点在于找到他的递推方程。 可简单算出填满第0 1 2 3 4列个数为0 1 2 5 11&#xff1b; 运气好点&#xff0c;找到递推公式dp[i]2*dp[i-1]dp[i-3]; 直接解决了。 但我们还是按照动态规划一步一步来。 思路分析&#xff1a; 状态定义&a…

css3鼠标悬停图片特效,图片悬停效果源码

特效介绍 css3鼠标悬停图片特效,图片悬停效果源码&#xff0c;可以在网页上面作为自己的动态加载名片&#xff0c;放到侧边栏或者网站合适的位置即可 动态效果 代码下载 css3鼠标悬停图片特效,图片悬停效果源码

docker进阶篇,docker集群介绍

docker swarm 官网&#xff1a;https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/ 什么是 docker swarm docker swarm 是 docker 官方提供的容器编排和集群管理工具。它允许用户将多个 docker 主机组成一个虚拟的 docker 集群&#xff0c;以便更高效地管理…

解决用POI库生成的word文件中的表格在python-docx无法解析的问题

问题背景 用apache-poi生成word文件中表格&#xff0c;在使用python-docx库解析时报错&#xff1a; 问题分析 1. word文档本质上是一个rar压缩包&#xff0c;用winrar解析后如下&#xff1a; 2. 查看document.xml&#xff0c;可以看到table元素下面是没有<w:tblGrid>这…

HTTP --- 上

目录 1. HTTP协议 2. 认识URL 2.1. URL中的四个主要字段 2.2. URL Encode && URL Decode 3. HTTP 协议格式 3.1. 快速构建 HTTP 请求和响应的报文格式 3.1.1. HTTP 请求格式 3.1.2. HTTP 响应格式 3.1.3. 关于 HTTP 请求 && 响应的宏观理解 3.2. 实现…

基于PID控制器的四旋翼无人机控制系统的simulink建模与仿真,并输出虚拟现实动画

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1四旋翼无人机的动力学模型 4.2 PID控制器设计 4.3 姿态控制实现 4.4 VR虚拟现实动画展示 5.完整工程文件 1.课题概述 基于PID控制器的四旋翼无人机控制系统的simulink建模与仿真,并输出vr虚拟现实…

CI/CD环境搭建

服务简介 Gitlab 官网&#xff1a;https://about.gitlab.com/ GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。安装方法是参考GitLab在GitHub上的Wiki页面。Gitlab是被广泛使用的基于git的开源代码管…

每日一题——LeetCode1720.解码异或后的数组

方法一 异或运算的性质 encoded[i−1]arr[i−1]⊕arr[i] 在等式两边同时异或arr[i−1] 由于&#xff1a; 一个数异或它自己&#xff0c;结果总是0。 0异或任何数&#xff0c;结果都是那个数本身。 所以等式可以转化为&#xff1a; arr[i]arr[i−1]⊕encoded[i−1] 由于 a…

智慧工业园区的物联网解决方案

智慧工业园区的物联网解决方案 智慧工业园区的物联网解决方案&#xff0c;是一种深度融合物联网、大数据、云计算及人工智能等前沿技术&#xff0c;以实现工业园区全方位、智能化管理与服务的综合体系。该方案旨在通过高效采集和分析园区内的各类实时数据&#xff0c;构建出一…

什么是PLC物联网关?PLC物联网关有哪些功能?

在数字化浪潮的推动下&#xff0c;工业物联网&#xff08;IIoT&#xff09;正逐步成为推动制造业智能化转型的关键力量。而在这一变革中&#xff0c;PLC物联网关扮演着至关重要的角色。今天&#xff0c;就让我们一起走进PLC物联网关的世界&#xff0c;了解它的定义、功能&#…