1、树的定义
树是n个结点的有限集合。n=0时称为空树,在任意一棵非空树中:(1)有且仅有一个特定的称为根的结点。(2)当n>1时,其余结点可以分为m个互不相交的有限集合,其中每一个集合本身又是一棵树。在此,我们主要来学习二叉树的应用。
1.1、树的结点的分类
结点拥有的子树数称为结点的度。度为0的结点称为叶子结点或者终端结点。度不为0的结点称为非终端结点或分支结点。除根结点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。
1.2、结点间的关系
结点子树的根称为该结点的孩子,相应的该结点称为孩子的双亲。同一个双亲的孩子之间互称兄弟。
2、什么是二叉树?
二叉树是N个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵不相交的、分别称为根结点的左子树和右子树的二叉树构成。
2.1、二叉树的特点
(1)每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。
(2)左子树和右子树是有顺序的,顺序不能颠倒。
2.2、介绍几种特殊二叉树
1、斜树
所有结点都只有左子树的二叉树叫左斜树。所有结点都是只有右子树的二叉树叫右斜树。这两者统称斜树。
2、满二叉树
在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上,这样的二叉树就称为满二叉树。
3、完全二叉树
对一颗具有n个结点的二叉树按层编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。
首先,我们要明确*"完全"和“满”*的差异,满二叉树一定是完全二叉树,但完全二叉树不一定是满的。
要判断一棵二叉树是否是完全二叉树其实很简单。先按层编号,当此二叉树的编号和满二叉树的编号一样时,此树就为完全二叉树,即使它不是满二叉树。
2.3、二叉树的性质
(1) 在二叉树的第i层上最多有2i-1 个节点 。(i>=1)
(2) 二叉树中如果深度为k,那么最多有2k-1个节点。(k>=1)
(3)n0=n2+1 n0表示度数为0的节点数,n2表示度数为2的节点数。
(4)在完全二叉树中,具有n个节点的完全二叉树的深度为[log2n]+1,其中[log2n]是向下取整。
2.3、二叉树的几种遍历方式
1、前序遍历
规则时若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。如图所示:遍历的顺序为ABDGHCEIF
2、中序遍历
规则时若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后是访问根结点,最后中序遍历右子树。如图所示:遍历顺序为:GDHBAEICF。
3、后续遍历
规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式访问左右子树,最后访问根结点。
如图所示:遍历顺序为GHDBIEFCA。
3、思考题
1、我们日常开发中哪些场景用到了树这种数据结构?
2、还有哪些类型的树?例如红黑树、霍夫曼树等。
3、尝试编码实现一下二叉树的几种遍历操作。