前言:树型结构是一类重要的非线性结构,其特点是结点之间有分支,并具有层次关系。
1.1 基本概念
1.1.1 树
树是由n(n≥1)个有限结点组成的一个具有层次关系的集合, 把它叫作“树”是因为它看起来像一棵倒挂的树,也就是说树是根朝上,而叶朝下的。如图所示:
它具有以下的特点:
① 每个结点有零个或多个子结点;
② 每个子结点只有一个父结点;
③ 没有前驱的结点为根结点;
④ 除了根结点外,每个子结点可以分为许多个不相交的子树。 为方便描述树的特点,先列出将会涉及到的树的基本概念:
①结点的度:一个结点含有的子树个数;
②树的度:一棵树中,最大的结点的度;
③叶结点(终端结点):度为0的结点;
④分支结点(非终端结点):度不为0的结点;
⑤孩子结点:一个结点的子树的根结点;
⑥双亲结点(父结点):在含有孩子的结点中,该结点称为孩子结点的双亲结点;
⑦兄弟结点:具有相同双亲的结点;
⑧祖先节点:从根到该结点所经分支上的所有结点;
⑨子孙结点:以某结点为根的子树中任意结点;
⑩节点的层次:从根开始定义,根为第一层,根的孩子为第二层,以此类推。如下图所示:
⑪树的高度(深度):树中结点的最大层次;
⑫路径:从根结点到某一结点的一条通道;
⑬路径长度:路径经过的边的个数。如下图所示:
1.1.2 二叉树
1.综述:二叉树是每个结点最多有两个子树的有序树,通常子树的根被称为“左子树”和“右子树”。如下图所示。二叉树是一种最简单的树结构,任何树都可以简单转换为二叉树。
2.树和二叉树的区别
①树的结点个数至少为1,而二叉树的结点个数可以为0;
②树中结点的最大度数没有限制,而二叉树结点最大度数为2; 3.两种特殊的而二叉树
(1)满二叉树
满二叉树中所有的叶节点都在最后一层,而其他分支结点的度数都为2。示例如下:
(2)完全二叉树
若一个二叉树扣除其最后一层后变成一个满二叉树,且最后一层的所有结点都向左靠齐,则称该二叉树为完全二叉树。示例如下:
★满二叉树一定为完全二叉树,完全二叉树不一定为满二叉树
3.二叉树常见的性质
性质1 一颗非空二叉树的第i层上最多有2i-1个结点(i≥1)
性质2 深度为h的二叉树最多有2h-1个结点(h>1)
性质3 对于任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1
性质4 若一个正则二叉树(只有度为0和2结点的二叉树)中有n个叶子结点,则该二叉树结点总数为log2n(由 性质2 推导)
性质5 对于具有n个结点的完全二叉树,如果如果按照从上到下、同一层次上的结点按从左 到右的顺序对二叉树中的所有结点从1开始顺序编号,则对于序号为i的结点,有
① 如果i>1,则序号为i的结点其双亲结点的序号为[i/2] ([i/2] 表示对i/2的值取整); 如果i=1,则结点i为根结点,没有双亲
② 如果2i>n,则结点i无左孩子(此时结点i为终端结点);否则其左孩子为结点2i
③ 如果2i+1>n,则结点i无右孩子;否则其右孩子为结点2i+1
1.1.3 森林
由m(m≥0)棵互不相交的树构成的集合称为森林。如下图所示,该森林由三棵树所构成:
1.2 基本操作
1.2.1 树的遍历
1.前序遍历
①访问根结点;
②按照从左到右的顺序前序遍历根结点的每一棵子树。
2.后序遍历
①按照从左到右的顺序后序遍历根结点的每一棵子树;
②访问根结点。
3.层序遍历(广度遍历)
从树的第一层(也就是根结点)开始自上而下逐层遍历,每一层按照从左到右的顺序逐个访问结点。
下图展示了按照这三种遍历方式所对应的遍历结果:
1.2.2 二叉树的遍历
1.前序遍历
①访问根结点
②前序遍历访问根结点的左子树
③前序遍历访问根结点的右子树
2.中序遍历
①中序遍历访问根结点的左子树
②访问根结点
③中序遍历访问根结点的右子树
3.后序遍历
①后序遍历访问根结点的左子树
②后序遍历访问根结点的右子树
③访问根结点
4.层序遍历
按照从上到下,同一层次从左到右的顺序访问二叉树
下图展示了一棵二叉树四种遍历方式的结果:
★由二叉树的前序(后序)序列和中序序列可以唯一确定一棵二叉树,但是只由前序序列和后序序列不能确定一棵二叉树。
1.2.3 森林的遍历
1.前序遍历
若森林非空,则:
①访问森林中第一棵树的根结点
②前序遍历第一棵树中根结点的每一棵子树
③前序遍历除第一棵树外的其他树
2.后序遍历
若森林非空,则:
①后序遍历第一棵树的根结点的各个子树
②访问第一棵树的根结点
③后序遍历除第一棵树外的其他树
下图给出了一个三棵树的森林的两种遍历结果:
★根据森林,树和二叉树的关系,可以得知:
①前序遍历森林=前序遍历该森林对应的二叉树
②后序遍历森林=中序遍历该森林所对应的二叉树
③前序遍历树=前序遍历该树所对应的二叉树
④后序遍历树=中序遍历该树所对应的二叉树
1.2.4 树、森林和二叉树的转换
1.树、森林转换成二叉树
①在所有兄弟之间加一条线
②对每个结点,去掉该结点和除长子外与其他孩子的连线
树转换为二叉树如下图所示:
森林转换成二叉树如下图所示:
2.二叉树转换成树、森林
若结点x是双亲y的左孩子,则把x的右孩子、右孩子的右孩子都与y连起来,最后去掉双亲到右孩子的连线。如图所示:
后置:C++数据结构_树的理论学习笔记(2)_存储结构,二叉树的实现