📋 个人简介
之前我们学习了顺序表和链表,然后用他们分别实现了两种特殊的线性表栈和队列,今天我们再来看一种新的数据结构:树
树
树的概念
树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
- 每个节点有零个或多个子节点;
- 没有父节点的节点称为根节点;
- 每一个非根节点有且只有一个父节点;
- 除了根节点外,每个子节点可以分为多个不相交的子树。
下图就是一颗树(画的不是很对称,强迫症勿怪)🙏
注意:树形结构中子树之间不能有交集,不然就不能称作树

树的相关概念

让我们来看看上面一颗树,各个节点之间的相互关系是什么
节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为3
叶节点或终端节点:度为0的节点称为叶节点; 如上图:J,F,K,L,H,I等节点为叶节点
非终端节点或分支节点:度不为0的节点; 如上图:B,C,D…等节点为分支节点
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的子节点
兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点
树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为3
节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、G互为兄弟节点
节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
森林:由m(m>0)棵互不相交的树的集合称为森林
树的表示方法
树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解其中最常用的孩子兄弟表示法。

对于这样一颗树,我们可以使用下面的方式来存储它


二叉树
二叉树的概念
二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树
通俗易懂的讲,就是一颗树,最多只能有两个分叉 (这是我自己的看法,哪儿说的不对,还请大佬指正)。
二叉树的五种形态
-
空二叉树:  -
只有一个根节点的二叉树:  -
只有左子树:  -
只有右子树:  -
完全二叉树:

特殊的二叉树
-
. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是
2
k
?
1
2^k - 1
2k?1。 -
完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
二叉树的性质
- 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有
2
(
i
?
1
)
2^(i-1)
2(i?1)个结点。
- 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是
2
h
?
1
2^h - 1
2h?1。
- 对任何一棵二叉树, 如果度为0其叶结点个数为
n
0
n_0
n0? , 度为2的分支结点个数为
n
2
n_2
n2? ,则有
n
0
=
n
2
+
1
n_0 = n_2 + 1
n0?=n2?+1
- 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=
log
?
2
(
n
+
1
)
\log_2(n + 1)
log2?(n+1)
- 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
- 若i>0,i位置节点的双亲序号:(i-1)/2; i=0,i为根节点编号,无双亲节点
- 若2i+1<n,左孩子序号:2i+1;否则,无左孩子
- . 若2i+2<n,右孩子序号:2i+2;否则,无右孩子
结语
欢迎各位参考与指导!!!博主最近在冲击C/C++领域新人,拜托大家帮忙点赞收藏一下??

|