24考研数据结构-树与森林

news2024/9/20 22:36:26

目录

  • 5.4树、森林
    • 5.4.1树的存储结构
      • 1. 双亲表示法(顺序存储):
      • 2. 孩子表示法(顺序+链式)
      • 3. 孩子兄弟表示法(链式)
    • 5.4.2树、森林与二叉树的转换
    • 5.4.3树、森林的遍历
      • 1. 树的遍历
        • 先根遍历
        • 后根遍历
        • 层序遍历(队列实现)
      • 2. 森林的遍历
    • 数据结构:树和森林的存储结构与遍历方式
      • 树的存储结构
        • 树的存储结构:链式存储结构
        • 树的存储结构:数组存储结构
      • 森林的存储结构
        • 森林的存储结构:链式存储结构
        • 森林的存储结构:数组存储结构
      • 树和森林的遍历方式
        • 前序遍历
        • 中序遍历
        • 后序遍历
      • 结论

5.4树、森林

在这里插入图片描述

5.4.1树的存储结构

1. 双亲表示法(顺序存储):

在这里插入图片描述

每个结点中保存指向双亲的指针
数据域:存放结点本身信息。
双亲域:指示本结点的双亲结点在数组中的位置。

#define MAX_TREE_SIZE 100  //树中最多结点数

typedef struct{      //树的结点定义
   ElemType data; 
   int parent;      //双亲位置域
}PTNode;

typedef struct{                   //树的类型定义
   PTNode nodes[MAX_TREE_SIZE];   //双亲表示
   int n;                         //结点数
}PTree;


基本操作:

  • 增:新增数据元素,无需按逻辑上的次序存储,只要在最后增加并且写上其父节点(需要更改结点数n)
  • 删(叶子结点):① 将伪指针域设置为-1;②用后面的数据填补(不会中间出现空数据);(需要更改结点数n)
  • 查询:①优点-查指定结点的双亲很方便;②缺点-查指定结点的孩子只能从头遍历,空数据导致遍历更慢;
  • 所以删除时用②用后面的数据填补(不会中间出现空数据);(需要更改结点数n)这个方法更好
  • 求双亲很方便,但是求结点的孩子需要遍历整个结构

2. 孩子表示法(顺序+链式)

孩子链表:把每个结点的孩子结点排列起来,看成是一个线性表,用单链表存储,则n个结点有n个孩子链表(叶子的孩子链表为空表)。而n个头结点又组成一个线性表,用顺序表(含n个元素的结构数组)存储
在这里插入图片描述
问题在于:找孩子方便,找双亲不方便,需要遍历整个结构(n个结点的孩子链表指针域指向的n个孩子链表)

struct CTNode{
   int child;    //孩子结点在数组中的位置
   struct CTNode *next;    // 下一个孩子
};

typedef struct{
   ElemType data;
   struct CTNode *firstChild;    // 第一个孩子
}CTBox;

typedef struct{
   CTBox nodes[MAX_TREE_SIZE];
   int n, r;   // 结点数和根的位置
}CTree;


3. 孩子兄弟表示法(链式)

第一个孩子与右兄弟
特点:

  1. 最大的优点是实现树转换成二叉树和相互转换
  2. 易于查找结点的孩子
  3. 缺点是从当前结点查找双亲很麻烦,可以为每个结点设置一个parent指针指向父结点
  4. 孩子表示法存储的树,在物理上是二叉树

在这里插入图片描述

typedef struct CSNode{
   ElemType data;                               //数据域
   struct CSNode *firstchild, *nextsibling;     //第一个孩子和右兄弟指针, *firstchild 看作左指针,*nextsibling看作右指针
}CSNode. *CSTree;


5.4.2树、森林与二叉树的转换

本质:森林中各个树的根结点之间视为兄弟关系

在这里插入图片描述
在这里插入图片描述

5.4.3树、森林的遍历

在这里插入图片描述
在这里插入图片描述

1. 树的遍历

先根后根都是深度优先,层次是广度优先遍历

先根遍历

  • 若树非空,先访问根结点,再依次对每棵子树进行先根遍历;(与对应二叉树的先序遍历序列相同树的深度优先遍历
void PreOrder(TreeNode *R){
   if(R!=NULL){
      visit(R);    //访问根节点
      while(R还有下一个子树T)
         PreOrder(T);      //先跟遍历下一个子树
   }
}


在这里插入图片描述

后根遍历

树的深度优先遍历

  • 若树非空,先依次对每棵子树进行后根遍历,最后再返回根节点;(与对应二叉树的中序遍历序列相同但是直接看的话还是后序遍历序列,不转化成二叉树来看的话就直接用后序遍历求解

在这里插入图片描述

void PostOrder(TreeNode *R){
   if(R!=NULL){
      while(R还有下一个子树T)
         PostOrder(T);      //后跟遍历下一个子树
      visit(R);    //访问根节点
   }
}


层序遍历(队列实现)

广度优先遍历

若树非空,则根结点入队;
若队列非空,队头元素出队并访问,同时将该元素的孩子依次入队;
重复以上操作直至队尾为空;

2. 森林的遍历

先序遍历:等同于依次对各个树进行先根遍历;也可以先转换成与之对应的二叉树,对二叉树进行先序遍历;
中序遍历:等同于依次对各个树进行后根遍历;也可以先转换成与之对应的二叉树,对二叉树进行中序遍历;

数据结构:树和森林的存储结构与遍历方式

树和森林是在计算机科学中常见的非线性数据结构,它们在组织和存储数据方面具有重要的作用。本文将介绍树和森林的存储结构,并详细解释它们的遍历方式。

树的存储结构

树是一种由节点和边构成的数据结构,其中有一个特殊的节点被称为根节点,其他节点可以分层次地连接在根节点下面。每个节点可以有零个或多个子节点,而每个子节点可以继续拥有自己的子节点,形成了一个层次化的结构。

树的存储结构:链式存储结构

树的链式存储结构是通过节点之间的指针连接来表示树的。每个节点都包含一个数据域和多个指向子节点的指针。根节点没有父节点,而其他节点有且仅有一个父节点。

struct TreeNode {
    int data;
    TreeNode* parent;
    vector<TreeNode*> children;
};

树的存储结构:数组存储结构

树的数组存储结构是通过数组来表示树的。将树的节点按层次遍历的顺序依次存储在数组中,通过数组下标可以找到节点之间的关系。

struct TreeNode {
    int data;
};

TreeNode tree[MAX_SIZE];

森林的存储结构

森林是由多个不相交的树组成的集合,每个树都是独立的。每个树的根节点都不属于其他任何树的子节点,因此它们是相互独立的树结构。

森林的存储结构:链式存储结构

森林的链式存储结构是通过多个树的链式存储结构组合在一起构成的。每个树都是一个独立的链式存储结构。

vector<TreeNode*> forest;

森林的存储结构:数组存储结构

森林的数组存储结构是通过多个数组存储结构组合在一起构成的。每个数组存储结构表示一棵树。

TreeNode forest[MAX_TREES][MAX_SIZE];

树和森林的遍历方式

树和森林的遍历方式是指访问树或森林中所有节点的方法。常见的树和森林遍历方式有三种:前序遍历、中序遍历和后序遍历。这三种遍历方式是基于节点的访问顺序来定义的。

前序遍历

前序遍历是指先访问根节点,然后按照从左到右的顺序依次访问每个子节点的遍历方式。在树和森林的存储结构中,前序遍历可以通过递归或栈的方式来实现。

中序遍历

中序遍历是指先按照从左到右的顺序依次访问每个子节点,然后再访问根节点的遍历方式。在树和森林的存储结构中,中序遍历可以通过递归或栈的方式来实现。

后序遍历

后序遍历是指先按照从左到右的顺序依次访问每个子节点,然后再访问根节点的遍历方式。在树和森林的存储结构中,后序遍历可以通过递归或栈的方式来实现。

结论

树和森林是非常重要的数据结构,它们在计算机科学中有着广泛的应用。通过链式存储结构和数组存储结构,我们可以灵活地表示树和森林,并实现它们的遍历方式。掌握树和森林的存储结构和遍历方式,对于学习和理解更复杂的数据结构和算法有着重要的意义。

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

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

相关文章

LeetCode-26-删除有序数组中的重复项

一&#xff1a;题目描述&#xff1a; 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯…

AI相机“妙鸭相机”原理分析和手动实现方案

妙鸭相机 一个通过上传大约20张照片&#xff0c;生成专属自拍。在2023年7月末爆火&#xff0c;根据36Kr报道&#xff0c;妙鸭相机系阿里系产品&#xff0c;挂靠在阿里大文娱体系下&#xff0c;并非独立公司。 使用方法是上传20张自拍照片&#xff0c;之后可以选择模板生成自己…

神码ai火车头标题伪原创【php源码】

这篇文章主要介绍了如何把python 代码打包成可执行软件&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 火车头采集ai伪原创插件截图&#xff1a; Python 程序封装-打包成exe程…

以指标驱动,保险、零售、制造企业开启精益敏捷运营的新范式

近日&#xff0c;以“释放数智生产力”为主题的 Kyligence 用户大会在上海前滩香格里拉大酒店成功举行。大会包含上午的主论坛和下午的 4 场平行论坛&#xff0c;并举办了闭门会议、Open Day 等活动。来自金融、零售、制造、医药等行业的客户及合作伙伴带来了超过 23 场主题演讲…

CSS调色网有哪些

本文章转载于湖南五车教育&#xff0c;仅用于学习和讨论&#xff0c;如有侵权请联系 1、https://webgradients.com/ Wbgradients 是一个在线调整渐变色的网站 &#xff0c;可以根据你想要的调整效果&#xff0c;同时支持复制 CSS 代码&#xff0c;可以更好的与开发对接。 Wbg…

selenium 截屏

当前环境&#xff1a; Windows 10 Python 3.7 selenium 3.141.0 Google Chrome 115.0.5790.110 &#xff08;64 位&#xff09; from selenium import webdriver import base64if __name__ __main__:#driver webdriver.Chrome()driver.get(https://www.baidu.com/)# 1.…

服务端高并发分布式结构演进之路

目录 一、常见概念 1.1基本概念 二、架构演进 2.1单机架构 2.2应用数据分离架构 2.3应用服务集群架构 2.4读写分离 / 主从分离架构 2.5引入缓存 —— 冷热分离架构 2.6垂直分库 2.7业务拆分 —— 微服务 一、常见概念 1.1基本概念 应用&#xff08;Application&am…

powerdesigner各种字体设置;preview字体设置;sql字体设置

1.设置左侧菜单&#xff1a; 步骤如下&#xff1a; tools —> general options —> fonts —> defalut UI font ,选择字体样式及大小即可&#xff0c;同下图。 2.设置preview字体大小&#xff08;sql预览&#xff09; 步骤如下&#xff1a; tools —> general o…

问道管理:两市股指冲高回落,沪指一度突破3300点,券商、保险板块领涨

8月4日&#xff0c;两市股指高开高走&#xff0c;沪指一度突破3300点。开盘后&#xff0c;沪指、深成指涨近1%&#xff0c;创业板指、上证50指数涨幅超1%。职业方面&#xff0c;券商、稳妥板块领涨&#xff0c;传媒、石油、半导体、银行、煤炭等板块均上扬&#xff0c;互联金融…

Oracle锁的学习

Oracle数据库中的锁机制 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时&#xff0c;在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据&#xff0c;破坏数据库的一致性。 在数据库中有两种基本的锁类…

拓展商业视野:利用企业变更记录 API 剖析企业策略与决策

引言 随着商业竞争日益激烈&#xff0c;企业的战略与决策成为成功与否的关键因素。在这样的背景下&#xff0c;利用变更记录查询API成为了企业洞察竞争对手、揭示市场动态、发现商业机会的重要工具。本文将深入探讨变更记录查询API的应用&#xff0c;揭示它如何拓展商业视野&a…

【项目 进程14】2.30 守护进程(1) 2.31 守护进程(2)

文章目录 2.30 守护进程&#xff08;1&#xff09;终端进程组会话进程组、会话、控制终端之间的关系进程组、会话操作函数守护进程2.31 守护进程&#xff08;2&#xff09;守护进程的创建步骤写一个守护进程&#xff0c;每隔2s获取一下系统时间&#xff0c;将这个时间写入到磁盘…

【枚举+trie+dfs】CF514 C

Problem - 514C - Codeforces 题意&#xff1a; 思路&#xff1a; 其实是trie上dfs的板题 先把字符串插入到字典树中 对于每次询问&#xff0c;都去字典树上dfs 注意到字符集只有3&#xff0c;因此如果发现有不同的字符&#xff0c;去枚举新的字符 Code&#xff1a; #in…

会用这个医疗小技巧,升职加薪不加班!

在医药领域&#xff0c;温湿度监控是确保药品质量和安全性的重要环节。药品的生产、存储、运输和展示过程中&#xff0c;温湿度变化可能对药品的有效性产生不良影响&#xff0c;因此需要实时监测和管理环境条件。 通过有效的温湿度监控系统&#xff0c;医药企业和医疗机构能够确…

docker系列--解决hyper-v导致docker无法启动问题

一、问题 windows docker desktop 启动报错异常&#xff0c;导致docker无法启动成功 我们看到问题出在hyper-v的问题上&#xff0c;搜索解决方法&#xff0c;官网常见问题如下 Overview | Docker Documentation 二、解决 Hyper-V 已安装并正常工作 在BIOS中启用虚拟化 Wind…

mapstruct 错误 java.lang.NoSuchMethodError: Ljava/lang/Double 错误

问题描述 在使用 mapstruct 的过程中遇到错误 java.lang.NoSuchMethodError: Ljava/lang/Double 错误 问题解决 maven clean, 然后 maven install Build -> Rebuild Project 执行 maven install 时, 如果报错 找不到 xxx 类, 但 ctrl鼠标左键 发现可以点进去这个类, 那…

[openCV]基于赛道追踪的智能车巡线方案V1

import cv2 as cv import os import numpy as npimport time# 遍历文件夹函数 def getFileList(dir, Filelist, extNone):"""获取文件夹及其子文件夹中文件列表输入 dir&#xff1a;文件夹根目录输入 ext: 扩展名返回&#xff1a; 文件路径列表""&quo…

【Axure 教程】动态面板

【动态面板】是 Axure 中另外一个神级的元件&#xff0c;它的江湖地位可以说跟【中继器】不相上下&#xff0c;【动态面板】提供了简单的配置&#xff0c;却可以实现非常丰富的效果&#xff0c;在实际设计中应用非常广泛。 对于刚入门的产品经理来说&#xff0c;学习【动态面板…

02 持久层 - 客制化

文章目录 OverView[0] Provision[1] New Package[2] Create Table[3] Insert MockData[4] Check Data OverView 创建 ABAP Package客制化底表向底表写入测试数据查看测试数据 [0] Provision 没有创建 BTP Trail User Account 的需先申请账号&#xff0c;并通过 Eclipse 连接到…

「2024」预备研究生mem- 等差数列与列项相消Sn的最值奇数项与偶数项

一、等差数列与列项相消 二、Sn的最值 三、奇数项与偶数项 方法二&#xff1a;