[转帖]小白科普丨何为树、二叉树和森林?

小白,科普,何为,二叉树,森林 · 浏览次数 : 0

小编点评

**摘要** 本文介绍了树、二叉树和森林的表示及相互转换。 **树** * 定义:n(n >= 0)个节点的==有限==集。 * 特质: * 根没有前驱,除根外的其他节点有且仅有一个前驱。 * 每个节点都可以有零个或多个后继。 **二叉树** * 定义:一种特殊的树形结构,它的特点是每个节点至多有两颗子树(即二叉树中不存在度大于2的节点),并且二叉树的子树有左右之分,不能随意颠倒。 **森林** * 定义:m(m >= 0)棵互不相交的树的集合。 **相互转换** * 树转换为二叉树:每个节点左指针指向它的第一个孩子,右指针指向它在树中的相邻右兄弟。 * 二叉树转换为森林:先将森林中的每棵树转换为二叉树,由于任何一棵和树对应的二叉树的右子树为空,若把森林中第二棵树根视为第一棵树根的右兄弟,即将第二棵树对应的二叉树当做第一棵二叉树根的右子树,将第三棵树对应的二叉树当做第二棵二叉树根的右子树…以此类推,即可将森林转换为二叉树。

正文

摘要:本文为大家带来树、二叉树和森林的表示及如何进行相互转换。

本文分享自华为云社区《树、二叉树和森林的表示及相互转换》,作者:1+1=王。

树的基本概念

树的定义:树是n(n >= 0)个节点的==有限==集。当n=0是,称为空树。

树的特点:

(1)树的根没有前驱,除根外的其他节点有且仅有一个前驱;
(2)每个节点都可以有零个或多个后继。

术语:

(1)节点的度:树中一个节点的孩子个数。
(2)树的度:树中节点的最大度。
(3)分支节点:度大于0的节点。
(4)叶子结点:度为0的节点。
(5)节点的深度:从根节点开始自顶向下逐层累加。
(6)节点的高度:从叶子节点开始自底向上逐层累加。
(7)树的高度:树中节点的最大层数。
(8)路径:两个节点之间所经过的节点序列。
(9)路径长度:路径上所经过的边的个数。
(10)森林:m(m >= 0)棵互不相交的树的集合。

二叉树的基本概念

二叉树的定义:一种特殊的树形结构,它的特点是每个节点至多有两颗子树(即二叉树中不存在度大于2的节点),并且二叉树的子树有左右之分,不能随意颠倒。

几种特殊的二叉树:

(1)满二叉树:一棵高度为h,且含有2^h - 1个节点的二叉树。

(2)完全二叉树:对应相同高度的满二叉树缺失最下层最右边的一些连续叶子结点。
(3)二叉排序树:左子树上所有节点的关键字都小于根节点的关键字;右子树上所有节点的关键字都大于根节点的关键字;左子树和右子树又各是一棵二叉排序树。(左 < 根 < 右)
(4)平衡二叉树:任一节点的左子树和右子树的深度之差不超过1的二叉排序树。

  • 二叉树的性质:

(1)二叉树的第i层上至多有2^i-1^个节点;
(2)深度为h的二叉树至多有2^k^ - 1个节点;
(3)对任何一个二叉树,若其终端节点树为n0,度为2的节点树为n2,则n0 = n2 + 1;
(4)具有n个节点的完全二叉树的深度为log~2~(n + 1)向上取整。
(5)对完全二叉树按从上到下、从左到右的顺序依次编号1,2,3,…,则有以下关系:
a. 当i>1时,节点i的双亲的编号为i / 2;
b. 当2i<=n时,节点i的左孩子编号为2i,否则无左孩子;
c. 当2i+1<=n时,节点i的右孩子编号为2i+1,否则无右孩子;
d.节点i所在层次为log~2~i + 1(向下取整)。

存储结构

二叉树的存储结构

顺序存储结构:用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为i的结点元素存储在某个数组下标为i-1的分量中。(适合完全二叉树和满二叉树)

链式存储结构:使用链表节点来存储二叉树中的每个节点。二叉链表包括数据域data、左指针域lchild和右指针域rchild三个域。

  1. typedef struct BiTNode{
  2. TElemType data;
  3. struct BiTNode *lchild, *rchild;
  4. }BiTNode,*BiTree;

树的存储结构

双亲表示法:用一组连续空间来存储树的每个结点,同时在每个结点中,附设一个指示器指示其双亲结点到链表中的位置。

  1. #define MAX_TREE_SIZE 100//节点最大个数
  2. typedef struct PTNode{//节点结构
  3. TElemType data;
  4. int parent;//双亲位置域
  5. }PTNode;
  6. typedef struct{//树结构
  7. PTNode nodes[MAX_TREE_SIZE ];
  8. int root,n;//根的位置和节点数
  9. }PTree;

孩子表示法:将没得节点的孩子节点都用单链表链接起来形成一个线性结构,此时n个节点就有n个孩子链表。

  1. #define MAX_TREE_SIZE 100//节点最大个数
  2. typedef struct CTNode{//孩子节点
  3. int child;
  4. struct CTNode *next;
  5. }*ChildPtr;
  6. typedef struct{
  7. TElemType data;
  8. ChildPtr firstChild;//孩子链表头指针
  9. }CTBox;
  10. typedef struct{//树结构
  11. CTBox nodes[MAX_TREE_SIZE ];
  12. int root,n;//根的位置和节点数
  13. }CTree;

孩子兄弟表示法(二叉树表示法):以二叉链表作为树的存储结构。每个节点包括三部分内容:节点值、指向第一个孩子结点的指针和指向下一个兄弟节点的指针。

  1. typedef struct CSNode{//节点结构
  2. TElemType data;
  3. struct CSNode *firstChild,*nextSibling;
  4. }CSNode,*CSTree;

树、二叉树和森林的相互转换

树转换为二叉树

  • 规则:每个节点左指针指向它的第一个孩子,右指针指向它在树中的相邻右兄弟。由于根节点没有兄弟,所以对应的二叉树没有右子树。
  • 画法:(1)在兄弟节点之间加一条线;(2)在每棵树根之间加一条线;(3)以第一棵根为轴心,顺时针旋转45度。

森林转换为二叉树

  • 规则:先将森林中的每棵树转换为二叉树,由于任何一棵和树对应的二叉树的右子树为空,若把森林中第二棵树根视为第一棵树根的右兄弟,即将第二棵树对应的二叉树当做第一棵二叉树根的右子树,将第三棵树对应的二叉树当做第二棵二叉树根的右子树…以此类推,即可将森林转换为二叉树。
  • 画法:(1)将森林中的每棵树转换为二叉树;(2)对每个节点,只保留它与第一个孩子的连线;(3)以根为轴心,顺时针旋转45度。

二叉树转换为森林

  • 若二叉树非空,则二叉树的根及其左子树为第一棵树的二叉树形式,将根与右子树断开
  • 将右子树视为一棵新的二叉树,重复第一步。

点击关注,第一时间了解华为云新鲜技术~

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览38474 人正在系统学习中

与[转帖]小白科普丨何为树、二叉树和森林?相似的内容:

[转帖]小白科普丨何为树、二叉树和森林?

摘要:本文为大家带来树、二叉树和森林的表示及如何进行相互转换。 本文分享自华为云社区《树、二叉树和森林的表示及相互转换》,作者:1+1=王。 树的基本概念 树的定义:树是n(n >= 0)个节点的==有限==集。当n=0是,称为空树。 树的特点: (1)树的根没有前驱,除根外的其他节点有且仅有一个前

[转帖]电脑小白必读的CPU基础知识大全,CPU知识科普最新全面讲解

http://www.lotpc.com/yjzs/9374.html 对于电脑来说,CPU是最核心的硬件之一,相当于人体的大脑,它决定着一台电脑的运算速度,无论是台式机还是笔记本,CPU的选购至关重要。相信大家对CPU还不是很了解,下面装机之家分享一下CPU知识科普最新全面讲解,想要学习CPU知识

[转帖]BIS出口管制新规说明会,进一步明确十大问题

https://zhuanlan.zhihu.com/p/573765504 10月13日晚9点,BIS就出口管制新规举行电话会议简报,出口执法助理副部长Thea Kendler主持会议。小白总结要点如下: 1、发布新规原因 沙利文说的很直白了,就是在先进芯片等高新技术领域维持自身科技霸权地位,遏制

[转帖]一文读懂美国的出口管制

https://zhuanlan.zhihu.com/p/568211990 一年多前小白写过一文读懂什么是制裁?,这篇出口管制的文章其实也是酝酿了很久,终于跟小白的粉丝们见面了,喜欢请记得点赞收藏哦♥️♥️♥️。 简单来说,出口管制主要管制美国的物项,不能“落入”某些不符合美国经济外交国家安全利益

[转帖]阿里巴巴Java开发手册(全册四版)

阿里官方Java代码规范标准《阿里巴巴Java开发手册2017/2018/2019/2020》小白必备!!! 2017年开春之际,阿里诚意献上重磅大礼:《阿里巴巴Java开发手册》,首次公开阿里官方Java代码规范标准。这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量

[转帖]专注于GOLANG、PYTHON、DB、CLUSTER 记一次压测引起的nginx负载均衡性能调优

https://xiaorui.cc/archives/3495 rfyiamcool2016年6月26日 0 Comments 这边有个性能要求极高的api要上线,这个服务端是golang http模块实现的。在上线之前我们理所当然的要做压力测试。起初是 “小白同学” 起头进行压力测试,但当我看到

[转帖]记一次压测引起的nginx负载均衡性能调优

https://xiaorui.cc/archives/3495 这边有个性能要求极高的api要上线,这个服务端是golang http模块实现的。在上线之前我们理所当然的要做压力测试。起初是 “小白同学” 起头进行压力测试,但当我看到那压力测试的结果时,我也是逗乐了。 现象是,直接访问Golang

[转帖]Intel至强可扩展处理器 Skylake-SP(Purley 最新一代至强)购买指南

前言 Intel Purley平台,Skylake-SP,至强可扩展处理器(铂金、黄金、白银、青铜)发售了,共58颗处理器。 这些处理器里哪些值得购买?哪些是骗小白的?它们各自的定位如何?本文将帮助你解决问题。 本文将会按照使用场景将这58颗处理器分类,并通过不同处理器在各自应用场景的性价比剔除一些

[转帖]性能优化必备——火焰图

引言 本文主要介绍火焰图及使用技巧,学习如何使用火焰图快速定位软件的性能卡点。结合最佳实践实战案例,帮助读者加深刻的理解火焰图构造及原理,理解 CPU 耗时,定位性能瓶颈。 背景 当前现状 假设没有火焰图,你是怎么调优程序代码的呢?让我们来捋一下。 1. 功能开关法 想当年我刚工作,还是一个技术小白

[转帖]小知识点 之 JVM -XX:MaxGCPauseMillis 与 -XX:GCTimeRatio

https://www.cnblogs.com/hellxz/p/14056403.html 写在前边 JVM调优更多是针对不同应用类型及目标进行的调整,往往有很大的实验成份,通过实验来针对当前应用设置相对合适的参数,提高应用程序的性能与稳定性 最近在复习JVM,Parallel Scavenage