目录
一.引言
俗话说:“十年树木,百年树人”,可一棵参天大树又何止十年光阴。不管是绿荫一圆的小苗亦或是天然氧吧的“绿肺”,都是从小到大,从根到茎,从茎到叶一步步成长起来的。所以,“珍爱“生命”,不乱砍乱伐”。言归正传,本篇文章将浅析一种新的数据结构——树(tree)。
之前我们所浅析的不管是线性表,还是栈,亦或是队列,都是一种一对一的线性结构,可现实中,还存在一对多的数据需要处理,所以我们以一种新的数据结构——树(tree)来解决此类问题。
二.基础知识
-
树(tree)的定义
-
树(tree)是n(n>=0)个ji结点的有限集合。当n = 0时我们称之为空树。
树
-
在任意一棵非空树中存在以下特性:
有且仅有一个特定的根节点(Root)
当n > 1时,其余结点可分为m(m > 0)个互不相交的有限集T1、T2、……Tm,其中每一个集合本身又是一棵树,并且称为树的子树(SubTree),如图所示:
子树
子树T1和T2属于树A的子树,同时,D,G,H,I组成的树又是B为结点的子树。
-
注意几点:
1.当n > 0 时根节点是唯一的,不可能存在多个根节点,只存在唯一的一个根节点。
2.当m > 0 时,子树的个数没有限制,但他们一定是相互不相交的。如图所示的结构就不符合树的定义,因为他们相交有xi相交的子树。
相交的结构不构成树
-
结点的分类
树的结点包含一个数据元素及若干指向其子树的分支。结点拥有的子树数称为结点的度(Degree)。度为0的结点称为叶结点(Leaf)或终端结点;度不为0的结点称为非终端结点或分支结点。除根节点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。如下图所示,因为这棵树结点的度的最大值是结点D的度,为3,则树的度也是3。
结点的分类
-
结点间的关系
节点的子树的根称为该结点的孩子(Child),相应的,该结点称为孩子的双亲(Parent)。(父母同体)。同一个双亲的孩子之间互称兄弟(Sibbling)。结点的祖先是从根节点到该结点所经分支上的所有结点。所以对于结点H来说,D、B、A都是它的祖先。如图所示:
结点间关系
-
其他相关概念
结点的层次(Level)从根节点开始定义,根为第一层,根的孩子为第二层。其双亲在同一层的结点互称为堂兄弟。如下图中的D、E、F为堂兄弟。树中结点的最大层次称为树的深度(Depth)或高度,当前树的深度为4。
树的层次
如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则为无序树。
森林(Forest)是m ( m > = 0 )棵树互不相交的树的集合。
-
线性结构和树结构的比较
线性结构 | 树结构 |
|
|
三.最简单的树——二叉树(Binary Tree)
二叉树(Binary Tree)是n(n >= 0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根节点和两棵互不相交的、分别称为根节点的左子树和右子树的二叉树组成。
-
二叉树的特点
每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。
左子树和右子树是有顺序的,次序不能任意颠倒
即使树中某结点至右一棵子树,也要区分它是左子树还是右子树
-
满二叉树
在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。
满二叉树
-
完全二叉树
对一棵具有n个结点的二叉树按层序编号,如果编号为i(1<i<n)的结点与同样深度的满二叉树中的编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。
完全二叉树
-
二叉树的遍历
二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问一次且仅被访问一次。
1.前序遍历
若二叉树为空,则返回,否则先访问根节点,然后前序遍历左子树,在前序遍历右子树。如图的遍历顺序为:ABDGHCEIF。
前序遍历
2.中序遍历
若二叉树为空,则返回,否则从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历右子树。如图的遍历顺序为:GDHBAEICF
中序遍历
3.后序遍历
若二叉树为空,则返回,否则从左至右先叶子后结点的方式遍历访问左右子树,最后访问根节点。如图所示遍历顺序为:GHDBIEFCA。
后序遍历
4.层次遍历
若树为空,则返回,否则从树的第一层开始访问,在同一层中,按从左至右的顺序对结点逐个进行访问。如图所示遍历顺序为:ABCDEFGHI。
层次遍历
【上一篇:】数据结构浅浅析之(二)——栈和队列(Stack && Queue):
https://blog.youkuaiyun.com/weixin_39951988/article/details/86518425
【下一篇:】数据结构浅浅析之(三)——树(Tree)(下篇——应用提高 附C++代码):
https://blog.youkuaiyun.com/weixin_39951988/article/details/86538352