【JS数据结构与算法】认识树

目录

一、生活中的树的特点

二、模拟成树结构

三、树的定义

四、树的基本术语

五、树结构的表示形式

六、二叉树

1、二叉树的定义

2、二叉树的属性

3、二叉树的五种形态

4、二叉树的特殊形态

5、二叉树的存储结构

5.1 顺序存储结构

5.2 链式存储结构


一、生活中的树的特点

生活中的树,长这样:
树

  • 它通常只有一个,与根相连接的是树干
  • 树干上又有若干个树枝树枝上可以分成若干个小的树枝
  • 树的末端有若干片树叶

二、模拟成树结构

将上面的树倒过来,每个树枝连接一个结点,每片树叶又是一个结点,就是我们数据结构中的树结构。

与树结构相似 的还有家族谱、公司组织架构以及知识结构等等。

其抽象出来的结构

三、树的定义

树(Tree)是n (n ≥ 0)个结点的有限集,它或为空树(n = 0);或为非空树,对于非空树T;

(1)有且仅有一个称之为根的结点。

(2)除根结点以外的其余结点可分为m(m ≥ 0)个互不相交的有限集T1,T2,...,Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)

树的结构定义是一个递归的定义,即在树的定义中有用到树的定义。

四、树的基本术语

这里的节点与结点的表示并无争议,两者皆可。

(1)结点:树中的一个独立单元,包含一个数据元素及若干个指向子结点的分支。如图中的A~K结点;

(2)结点的度(Degree):结点拥有的子树数称为结点的度。如A的度为4,E的度为1,D的度为0;

(3)树的度:树的度是树内各结点度的最大值。如图中树的度为4;

(4)叶子(Leaf):度为0的结点称为叶子或者是终端结点。如F,J,K,H,C,D,I都是叶子;

(5)双亲结点或父结点(Parent):若一个结点含有子结点,则这个结点称为其子结点的父结点,如图B是F,G,H的父结点;

(6)孩子结点或子结点(Child):一个结点含有的子树的根结点称为该结点的子结点,H是B的子结点,F是B的子结点;

(7)兄弟结点(Sibling):具有相同父结点的结点互称为兄弟结点,F与G是兄弟结点;

(8)结点的层次(Level):从根开始定义起,根为第1层,根的子结点为第2层,以此类推;上图中A位于第一层,K位于第四层;

(9)树的高度或深度(Depth):树中结点的最大层次;上图该树的深度为4;

(10)非终端结点或分支结点:度不为0的结点;

(11)堂兄弟结点:双亲在同一层的结点互为堂兄弟;

(12)结点的祖先:从根到该结点所经分支上的所有结点;

(13)子孙:以某结点为根的子树中任一结点都称为该结点的子孙;

(14)森林:由m(m>=0)棵互不相交的树的集合称为森林。

五、树结构的表示形式

  • 树的父子关系结点模拟成链表连接结点时,可以是以下结构

但是我们想想,如果以这种无脑申请空位指针时,就会变得非常复杂,我们到底是要申请一个还是两个还是多个,到最后可能还不能真正的满足我们的需求。

所以这种方式来构造我们的树结构不是很好。

  • 儿子-兄弟表示法

在定义结点时,只需包含三个属性

  • this.key:存储的数据内容。也可以以键值对的形式存储[key, value]
  • this.left:用于指向左子树。
  • this.sibling:用于指向一个兄弟结点。

不难发现,当我们把这个儿子-兄弟表示法表示出来的结构旋转45°之后,达到的是一棵二叉树。

所有树都可以以这种形式模拟成二叉树

六、二叉树

1、二叉树的定义

二叉树(Binary Tree)是 n (n ≥ 0)个结点所构成的集合,它或为空树(n = 0);或为非空树,对于非空树 T ;

(1)有且仅有一个称之为根的结点。

(2)除根结点以外的其余结点可分为两个互不相交的有限集 T1 和 T2 ,分别称为 T 的左子树和右子树,且 T1 和 T2 本身又都是二叉树。

2、二叉树的属性

(1) 在非空二叉树中,第 i 层的结点总数不超过  ,  i >= 1;

(2) 深度为h的二叉树最多有  个结点( h >= 1),最少有h个结点;

(3) 对于任意一棵二叉树,如果其叶结点数为 N0,而度数为2的结点总数为 N2 ,则 N0 = N2 + 1;

  • 满二叉树:深度为h且含有个结点的二叉树。

        每一层上的结点数都是最大结点数,即每一层 i 的结点数都具有最大值

  • 完全二叉树:深度为 k 的,有 n 个结点的二叉树,当且仅当每一个结点都与深度为 k 的满二叉树中编号从 1 至 n 的结点一一对应时。称之为完全二叉树。

          (1)叶子结点只允许在层次最大的两层上出现。

          (2)对任一结点,若其右分支下的子孙的最大层次为 l ,其左分支下的子孙的最大层次必定为 l 或 l + 1,

(4) 具有 n 个结点的完全二叉树的深度为 (注:[ ]表示向下取整)

(5)有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:

  •            若 I 为结点编号则 如果 I > 1,则其父结点的编号为 I / 2;
  •            如果 2 * I <= N,则其左孩子(即左子树的根结点)的编号为 2 * I;若 2 * I > N,则无左孩子;
  •            如果 2 * I + 1 <= N,则其右孩子的结点编号为 2 * I + 1;若 2 * I + 1 > N,则无右孩子。

(6)给定 N 个节点,能构成 h ( N )种不同的二叉树。 h( N )为卡特兰数的第 N 项。h( n )=C( 2 * n ,n)/(n + 1)。

(7)设有 i 个枝点,I为所有枝点的道路长度总和,J 为叶的道路长度总和 J = I + 2i

3、二叉树的五种形态

4、二叉树的特殊形态

5、二叉树的存储结构

5.1 顺序存储结构

对于这样一棵完全二叉树,我们以数组的形式存储元素,得到下面的数组

结点

A 

B

C

D

E

F

序号

1

2

3

4

5

6

但我们发现并不是所有的二叉树都能够像完全二叉树那样将元素顺序存储,比如以下二叉树

结点

A 

B

C

^

D

E

^

^

^

^

F

序号

1

2

3

4

5

6

7

8

9

10

11

这样的话会造成大量的空间浪费,更适合采用以下的链式存储结构

5.2 链式存储结构

由二叉树的定义可知,二叉树的结点由一个数据元素和分别指向左、右结点的两个分支构成,所以表示二叉树的链表中的结点至少要包含三个域。

  • data:数据域。
  • lchild:左指针域。
  • rchild:右指针域。

有时候,为了便于找到结点的双亲,我们可以增加一个指向其双亲结点的指针域。这两种结点结构所得的二叉树的存储结构分别称之为二叉链表和三叉链表。

猜你喜欢

转载自blog.csdn.net/weixin_42339197/article/details/99671691