小白科普丨何为树、二叉树和森林?

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

小编点评

**树、二叉树和森林的表示及相互转换** **树** * 定义:树是包含n(n >= 0)个节点的有限集。 * 特征: * 根没有前驱,除根外的其他节点有且仅有一个前驱。 * 每个节点可以有零个或多个后继。 **二叉树** * 定义:一种特殊的树形结构,它的特点是每个节点至多有两颗子树(即二叉树中不存在度大于2的节点)。 * 特征: * 每个节点至多有2^i-1个子树。 * 深度为h的二叉树至多有2^k^ - 1个节点。 * 对任何一个二叉树,若其终端节点树为n0,度为2的节点树为n2,则n0 = n2 + 1。 * 具有n个节点的完全二叉树的深度为log~2~(n + 1)向上取整。 **森林** * 定义:m(m >= 0)棵互不相交的树的集合。 **相互转换** * 树转换为二叉树: * 每个节点左指针指向它的第一个孩子。 * 右指针指向它在树中的相邻右兄弟。 * 根节点没有兄弟,所以对应的二叉树没有右子树。 * 二叉树转换为森林: * 将森林中的每棵树转换为二叉树。 * 对每个节点,只保留它与第一个孩子的连线。 * 以根为轴心,顺时针旋转45度。 **图示** **树** ``` A / \ B C / \ \ D E F ``` **二叉树** ``` A / \ B C / \ \ D E F ``` **森林** ``` A / \ B C / \ \ D E F ```

正文

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

本文分享自华为云社区《树、二叉树和森林的表示及相互转换》,作者: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三个域。

typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;

树的存储结构

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

#define MAX_TREE_SIZE 100//节点最大个数
typedef struct PTNode{//节点结构
TElemType data;
int parent;//双亲位置域
}PTNode;
typedef struct{//树结构
PTNode nodes[MAX_TREE_SIZE ];
int root,n;//根的位置和节点数
}PTree;

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

#define MAX_TREE_SIZE 100//节点最大个数
typedef struct CTNode{//孩子节点
int child;
struct CTNode *next;
}*ChildPtr;
typedef struct{
TElemType data;
ChildPtr firstChild;//孩子链表头指针
}CTBox;
typedef struct{//树结构
CTBox nodes[MAX_TREE_SIZE ];
int root,n;//根的位置和节点数
}CTree;

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

typedef struct CSNode{//节点结构
TElemType data;
struct CSNode *firstChild,*nextSibling;
}CSNode,*CSTree;

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

树转换为二叉树

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

森林转换为二叉树

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

二叉树转换为森林

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

 

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

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

小白科普丨何为树、二叉树和森林?

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

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

摘要:本文为大家带来树、二叉树和森林的表示及如何进行相互转换。 本文分享自华为云社区《树、二叉树和森林的表示及相互转换》,作者: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、发布新规原因 沙利文说的很直白了,就是在先进芯片等高新技术领域维持自身科技霸权地位,遏制

小白也能懂的Mysql数据库索引详解

一文让你彻底了解:主键索引/二级索引,聚簇索引/非聚簇索引,回表/索引覆盖,索引下推,联合索引/最左联合匹配,前缀索引,explain

小白也能懂的Mysql数据库索引详解

核心概念 主键索引/二级索引 聚簇索引/非聚簇索引 回表/索引覆盖 索引下推 联合索引/最左联合匹配 前缀索引 explain 一、[索引定义] 1.索引定义 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法

【小白新手教程】Ubuntu中安装MongoDB

本文由葡萄城技术团队于博客园原创并首发转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 分享给小白的操作教程 , 希望给有需要的人一点帮助。虽然是一个简单的问题,老手可能已经得心应手了,但是作为新手却要研究很久,这里按步骤给大家分享一下如何完成在Ubuntu

小白都会的数据可视化大屏搭建,速来学习

华为云aPaaS DTSE技术布道师左倩与开发者和伙伴们交流了SVE的独特价值优势和应用实践,手把手教大家基于开天aPaaS集成工作台流编排搭建轻应用和0码构建业务可视化大屏,体验“一次开发、多端使用”的极致便利。

当小白遇到FullGC

本文记录了一次排查FullGC导致的TP99过高过程,介绍了一些排查时思路,线索以及工具的使用,希望能够帮助一些新手在排查问题没有很好的思路时,提供一些思路,让小白也能轻松解决FullGC问题

C++算法之旅、09 力扣篇 | 常见面试笔试题(上)算法小白专用

算法学习笔记,记录容易忘记的知识点和难题。详解时空复杂度、50道常见面试笔试题,包括数组、单链表、栈、队列、字符串、哈希表、二叉树、递归、迭代、分治类型题目,均带思路与C++题解