个性签名:整个建筑最重要的是地基,地基不稳,地动山摇。而学技术更要扎稳基础,关注我,带你稳扎每一板块邻域的基础。
博客主页:七归的博客
专栏:数据结构(C语言版)
南来的北往的,走过路过千万别错过,错过本篇,“精彩”可能与您失之交臂 la
有代码,就有注释!!!
Triple attack(三连击):Comment,Like and Collect—>Attention

文章目录

  • 1、树
    • 1.1、基本概念
    • 1.2、基本术语
      • 1.2.1、结点之间的关系描述
      • 1.2.2、结点与树的属性描述
      • 1.2.3、有序树、无序树
      • 1.2.4、森林
    • 1.3、树的性质
  • 2、树的存储结构
    • 2.1、双亲表示法(顺序存储)
    • 2.2、孩子表示法(顺序+链式存储)
    • 2.3、孩子兄弟表示法(链式存储)
    • 2.4、树、森林与二叉树的转换
      • 2.4.1、森林、树转化为二叉树
      • 2.4.2、二叉树还原为森林、树
  • 3、树、森林的遍历
    • 3.1、树的遍历
      • 3.1.1、先根遍历
      • 3.1.2、后根遍历(深度优先遍历)
      • 3.1.3、层次遍历(广度优先遍历)
    • 3.2、森林的遍历
      • 3.2.1、先序遍历
      • 3.2.2、中序遍历

数据结构三要素:逻辑结构、数据的运算、存储结构(物理结构)。存储结构不同,运算的实现方式不同。

1、树

1.1、基本概念

树是n(n≥0)n(n\geq 0)n(n≥0)个结点的有限集合,n=0时即结点数为0,称为空树。
任意一棵非空树应满足

  • 有且仅有一个特定的称为根的结点
  • 当n>1时,其余结点可分为m(m>0)个互不相交的有限集合,其中每个集合本身又是一棵树,并且称为根结点的子树。

非空树的特性

  • 有且仅有一个根结点
  • 没有后继的结点称为叶子结点
  • 有后继的结点称为分支结点
  • 除了根结点外,任何一个结点都有且仅有一个前驱
  • 每个结点可以有0个或多个后继

树的逻辑表示法

  • 树形表示法
  • 文氏图表示法
  • 凹入表示法
  • 括号表示法

1.2、基本术语

1.2.1、结点之间的关系描述
  • 祖先结点
  • 子孙结点
  • 双亲结点(父节点)
  • 孩子结点
  • 兄弟结点
  • 堂兄弟结点
  • 路径:两个结点之间的路径只能从上往下
  • 路径长度:经过几条边
1.2.2、结点与树的属性描述

属性:

  • 结点的层次(深度)——从上往下数(默认从1开始)
  • 结点的高度——从下往上数
  • 树的高度(深度)——总共多少层
  • 结点的度——有几个孩子(分支数)注:非叶子结点的度>0,叶子结点的度=0
  • 树的度:各结点的度的最大值
1.2.3、有序树、无序树

逻辑上看,各子树是否有序,位置是否可互换
判断:具体看用树存什么,是否需要用结点的左右位置反映某些逻辑关系

  • 有序树:逻辑上看,树中的结点的各子树从左至右是有次序的,不能互换
  • 无序树:逻辑上看,树中的结点的各子树从左至右是无次序的,可以互换
1.2.4、森林

森林是m(m≥0)m(m\geq 0)m(m≥0)互不相交的树的集合。

1.3、树的性质

  • 1、结点数=总度数+1
    结点的度——结点有几个孩子(分支数)

  • 2、度为m的数、m叉树的区别

    • 度为m的树

      • 至少有一个结点度=m
      • 一定是非空树
    • m叉树
      • 允许所有结点的度都<m
      • 可以是空树
  • 3、度为m的树第i层至多有mi−1m^{i-1}mi−1个结点(i≥1i\geq 1i≥1)
    m叉树——第i层至多有mi−1m^{i-1}mi−1个结点(i≥1个结点(i\geq 1个结点(i≥1)

  • 4、高度为h的m叉树至多有mh−1m−1\frac{m^{h}-1}{m-1}m−1mh−1​个结点

  • 5、高度为h的m叉树至少有m*h-1个结点
    高度为h、度为m的树至少有h+m-1个结点

  • 6、具有n个结点的m叉树的最小高度为⌈logm(n(m−1)+1)⌉\left \lceil log_{m}(n(m-1)+1) \right \rceil⌈logm​(n(m−1)+1)⌉

2、树的存储结构

2.1、双亲表示法(顺序存储)

顺序存储各个结点,每个结点中保存指向双亲的“指针”。

  • 优点:查指定结点的双亲很方便
  • 缺点:查指定结点的孩子只能从头遍历
  • 空数据导致遍历更慢
#define MaxSize 100
typedef struct
{ElemType data;     //存放结点的值int parent;         //存放双亲的位置
}PTree[MaxSize];        //PTree为双亲存储结构类型

2.2、孩子表示法(顺序+链式存储)

顺序存储各个结点,每个结点中保存孩子链表头指针

  • 优点:找孩子方便,计算机指定结点的度比较方便
  • 缺点:找父节点不方便

MaxSons为最多的孩子结点个数,或称为该树的度。

typedef struct
{ElemType data;         //结点的值struct node *sons[MaxSons];       //指向孩子结点
}TSonNode;          //孩子链存储结构中的结点类型

2.3、孩子兄弟表示法(链式存储)

用二叉链表存储树——左孩子右兄弟
为每个结点设计3个域:

  • 一个数据元素域
  • 一个指向该结点的左边第一个孩子结点(长子)的指针域
  • 一个指向该结点的下一个兄弟结点的指针域

孩子兄弟链存储结构实际上是把该树转化为二叉树的存储结构

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

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

本质:用二叉链表存储森林——左孩子右兄弟。森林中各个树的根节点之间视为兄弟关系

2.4.1、森林、树转化为二叉树
  • 树中所有相邻兄弟之间加一条连线
  • 对树中的每个结点只保留它与长子之间的连线,删除与其他孩子之间的连线
  • 以树的根结点为轴心,将整棵树顺时针转动45°,使之结构层次分明
2.4.2、二叉树还原为森林、树
  • 若某结点是其双亲的左孩子,则把该结点的右孩子、右孩子的右孩子等都与该结点的双亲结点用连线连起来
  • 删除原二叉树中所有双亲结点与右孩子结点之间的连线
  • 整理由前面两步得到的树,即以根结点为轴心,逆时针转动45°,使之结构层次分明

3、树、森林的遍历

3.1、树的遍历

树的遍历运算是指按某种方式访问树中的所有结点且每一个结点只被访问一次。树的遍历方式主要有先根遍历、后根遍历和层次遍历三种。注意:树的先根遍历和后根遍历过着都是递归的。

3.1.1、先根遍历

若树非空,先访问根结点,再依次对每棵子树进行先根遍历

3.1.2、后根遍历(深度优先遍历)

若树非空,先依次对每棵子树进行后根遍历,最后再访问根结点。树的后根遍历序列与这棵树相应二叉树的中序序列相同

3.1.3、层次遍历(广度优先遍历)

1.若树非空,则根节点入队;2.若队列非空,队头元素出队并访问,同时将该元素的孩子依次入队;3.重复2的步骤直到队列为空。(用队列实现)

3.2、森林的遍历

3.2.1、先序遍历

若森林为非空,则按如下规则进行遍历:
访问森林中第一棵树的根结点;先序遍历第一棵树中根结点的子树森林;先序遍历除去第一棵树之后剩余的树构成的森林。

3.2.2、中序遍历

若森林为非空,则按如下规则进行遍历:
中序遍历森林中第一棵树的根结点的子树森林;访问第一棵树的根结点;中序遍历除去第一棵树之后剩余的树构成的森林。

双非本科生进大厂,而我还在底层默默地爬树(上)相关推荐

  1. 从双非到应届大厂ssp offer ,再到万能博主,我是怎么做到的?

    大家好,我是堂妹. 目前是大厂研发一枚, 从双非到应届大厂ssp offer , 再到万能博主,业余时间维护了自己的公众号: 也有江湖人称:堂主.九姐. 我在公众号里日常分享: 硬核技术.职场思考.生 ...

  2. 双非本科生如何才能进入腾讯、阿里、百度这些大厂?

    首先,解释一下,什么是双非本科,就是它既不是 985,也不是 211,但是个本科.至于是一本还是二本,不是重点,只要不是民办本科:差别有,但差别没有大到离谱. 那双非本科如何进 BAT 呢?或者 AT ...

  3. 阿里技术四面+交叉面+HR面成功拿到offer,谁说双非本科进不了大厂?

    前言 前两天,我收到了阿里巴巴的实习offer,从学长内推开始面试到拿到最后offer经历了4面技术.一面交叉面和一面HR面.经过了漫长的等待和几次几乎折磨的面试之后,终于拿到了实习offer. 自我 ...

  4. 阿里技术四面+交叉面+HR面,成功拿到offer,双非本科进不了大厂?

    前言 前两天,我收到了阿里巴巴的实习offer,从学长内推开始面试到拿到最后offer经历了4面技术.一面交叉面和一面HR面.经过了漫长的等待和几次几乎折磨的面试之后,终于拿到了实习offer. 自我 ...

  5. 2023届嵌入式笔面经一位双非本科生的秋招日记

    文章目录 秋招日记 一.个人背景 二.学习经历 三.实习经历 四.Offer收获情况 五.各大公司笔面试真题 星宸科技 应聘岗位:Linux驱动工程师 2022年08月13日--笔试 2022年08月 ...

  6. 【面试经验分享】双非研究生斩获大厂算法offer

    作者 | 顾叶峰   整理 | NewBeeNLP 面试锦囊之面经分享系列,持续更新中 写在前面 双非,本科研究生一个学校.岗位:NLP.无实习,一篇中文核心,三个水比赛top10. 收到offer: ...

  7. 双非本科到大厂,贫困家庭到深圳买房,我的逆袭之路

    20岁的你是否在拼命努力的奋斗呢? 人这一生,其实大大小小有很多的节点,每个年纪该干每个年纪的事情,一步一步的朝前走下去,应该是大部分人目前的现状. 最近一年来,这个号新增了很多的读者,大家对我还不是 ...

  8. 双非本科进不了大厂?阿里技术四面+交叉面+HR面,成功拿到offer

    前言 前阵子,我表弟收到了阿里巴巴的实习offer,从学长内推开始面试到拿到最后offer经历了4面技术.一面交叉面和一面HR面.经过了漫长的等待和几次几乎折磨的面试之后,终于拿到了实习offer. ...

  9. 双非本科生、非大厂,毕业一年,业余净收入20万

    本篇博文采用Q&A方式,采访一位大学朋友,分享一下他毕业一年,业余仅靠外包项目,净收入20万的经历和心路历程. 这位朋友,好友调侃戏称为:吴总,我们的求学经历如出一辙,专科结识于实验室,通过同 ...

  10. 35 w年薪,入职CV算法岗,我一个双非本科生如何做到的?

    经过前前后后半年多的努力,我终于成功转型,拿到35万年薪的CV算法岗-- 我是个非985/211的普通本科生,非计算机专业,在毕业前一年就计划转IT,经过一年的努力转型还算顺利! 在经过了近两年的应用 ...

最新文章

  1. 科技公司狂挖高校AI学者:涸泽而渔还是产学双赢
  2. 小程序工程化实践(上篇)-- 手把手教你撸一个小程序 webpack 插件,一个例子带你熟悉 webpack 工作流程...
  3. Tribonacci(泰波那契)数列前n项和的求解问题
  4. 【数据平台】Eclipse+Scala远程开发调试关于hostname的问题
  5. 42:换汽水瓶ExchangeBottle
  6. PostgreSQL 9.4版本的物化视图更新
  7. 《纵向切入ASP.NET 3.5控件和组件开发技术》笔记:高效率事件集合对象
  8. 环形链表得golang实现
  9. tolua#是Unity静态绑定lua的一个解决方案
  10. URAL 1934 Black Spot --- 最短的简单修改
  11. 干净地卸载QTP的小工具 - QTPCleanUninstaller
  12. Django:报错 unsupported format character ‘Y‘ (0x59) at index 70
  13. 红番茄(VS2017)两个注意点
  14. itunes安装失败 “apple应用程序支持安装失败”
  15. 计算二叉树叶子结点数目(C语言)
  16. 准备了个freyja实例项目(单数据源版)
  17. activiti多人会签
  18. JS基础之数组--概述、创建数组的几种方式、数组的特点、数组的常用方法、数组的解构赋值、数组高级API
  19. 儿童台灯怎么选对眼睛好?分享央视推荐的护眼灯
  20. SQL Sever 数据库视频 (一) (SQL基础及管理工具)

热门文章

  1. 英特尔芯片组系列 服务器,Intel 7系列芯片组正式发布 不同型号解析
  2. C# 判断是否是节假日
  3. 小程序性能和体验优化方法
  4. dolphinscheduler 2.0.3 Docker部署 不支持mysql的解决办法
  5. 腾格尔刚刚参加线上演唱会,又传《巴林塔娜》合作主题曲身价倍增
  6. Pytorch:Unet网络代码详解
  7. XML学习记录(归纳总结,方便查看)
  8. 计算机上安装的网络协议,win10系统正确安装网络协议的方法
  9. 小程序录音php上传,微信小程序录音文件.silk上传服务器转mp3格式
  10. 珍藏,最全面+最完善的Excel条件格式使用手册