一、树的概念
树是一种分组的层次结构。
树的定义:
树是n(n>=0)个数据元素的集合,在任意一棵非空树中,有如下特征
- 有且只有一个根结点(无前驱结点)
- 当n>1时,其他结点被分为若干个互不相交集合,并且每个集合又是一棵树
我们可以看到树的定义引用了集合的概念和迭代的概念。
二、树的表示方法
- 文氏图
- 圆括号
- 凹入法
- 树形图
三、基本术语
- 结点:树的结点包含一个数据元素和若干指向其他子树的分支
- 结点的度:结点的子节点的个数
- 树的度:树的所有结点的度的最大值
- 叶子结点:结点的度为0的结点
- 分支结点:结点的度不为0的结点
- 兄弟结点:同一个父结点下的子节点称为兄弟结点
- 层数:根节点的层数为1,其他结点的层数为父节点的层数加1
- 树的深度:所有结点层数的最大值
- 森林:零棵或者有限棵互不相交的树称为森林
- 有序树和无序数:结点的各子节点从左到右无序(可以互换)的树称之为无序树,否则称为有序树
四、二叉树
1、二叉树的定义
一种特殊的树,除了有树的特征外,还有如下特征:
- 当结点数大于0时,该树由根节点和两个子树组成,分别称之为左子树和右子树
- 左子树和右子树又是二叉树
2、二叉树的基本操作
- CreateTree创建一棵二叉树
- ShowTree用凹入法或者圆括号法显示一棵二叉树
- PreOrder按照先序(根,左,右)遍历一棵二叉树上的所有结点
- InOrder按照中序(左,根,右)遍历一棵二叉树上的所有结点
- PostOrder按照后序(左,右,根)遍历一棵二叉树上的所有结点
- LevelOrder按层次遍历一棵二叉树上的所有结点
- Leafnum求一棵二叉树上的所有叶子结点
- TreeDepth求一棵二叉树的深度
3、二叉树的性质
- 一棵二叉树的第i层至多有2分之i-1个结点
- 深度为h的一棵二叉树至多有2分之h-1个结点
- 对于一棵有n个结点的完全二叉树,若按照满二叉树的方式对结点进行编号,对于任意编号为i的结点,有如下性质
- i等于1的结点为根结点,当i>1时,该结点的父节点编号为i/2
- 当2i<=n时,该结点的左子结点编号为2i,当2i>n时,该结点没有左子节点
- 当2i+1<=n时,该结点的右子节点编号为2i+1,当2i+1>n时,该结点没有右子节点
- 具有n(n>0)个结点的完全二叉树,其深度为floor(log2n)+1,floor表示向下取整
- 对于一棵非空的二叉树,设结点的度为0,1,2的结点的个数分别为n0,n1,n2,那么有:n0=n2+1