树:n(n20)个结点的有限集合,当n=0时,称为空树;任意一棵非空树T满足以下条件:
( 1 )有且仅有一一个特定的称为根的结点;
(2)当n> 1时,除根结点之外的其余结点被分成m (m>0)个互不相交的有限集合T,2.... Tm,其中每个集合又是一-棵树,并至称为这个根结点的子树。
树的定义是采用递归方法
树的基本术语
结点的度 :结点所拥有的子 树的个数
树的度:树中各结点度的最大值
叶子结点:度为0的结点,也称为终端结点才分支结点:度不为0的结点,也称为非终端结点
孩子 :树中某结点子树的根结点称为这个结点的孩子结点,双亲: 这个结点称为它孩子结点的双亲结点
兄弟:具有同-一个双亲的孩子结点互称为兄弟
在线性结构中,逻辑关系表现为前驱一后继
在树结构中,逻辑关系表现为双亲一 孩子
路径:结点序列.n.....称为一条由n至ng的路径,当且仅当满足如下关系:结点n;是n:+1的双亲(1<=i<k)
才路径长度:路径上经过的边的个数
祖先、子孙:如果有一条路径从结点x到结点y,则x称为y的祖先,而y称为x的子孙
在树结构中,路径是唯一的
二叉树的定义
二叉树: n(n20 )个结点的有限集合,该集合或者为空集(称为空二叉树) , 或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。
满二叉树
满二叉树:所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上的二叉树
O满二叉树有什么特点呢?
( 1 )叶子只能出现在最下一层
(2)只有度为0和度为2的结点
(3 )在同样深度的二叉树中结点个数最多
(4 )在同样深度的二叉树中叶子结点个数最多
满二叉树是树结构的特例,是最丰满的二叉树
完全二叉树
★完全二叉树:在满二叉树中,从最后一个结点开始,连续去掉任意个结点得到的二叉树
O完全二叉树有什么特点呢?
( 1 )叶子结点只能出现在最下两层且最下层的叶子结点都集中在二叉树的左面
(2)完全二叉树中如果有度为1的结点,只可能有一个,且该结点只有左孩子
(3)深度为k的完全=叉树在k-1层上一定是满二二叉树
(4)在同样结点个数的二叉树中,完全二叉树的深度最小
二叉树的抽象数据类型定义 }
ADT BiTree
DataModel
二叉树由一个根结点和两棵互不相交的左右子树构成,结点具有层次关系Operation
InitBiTree :初始化-棵空的=叉树
CreatBiTree :建立-棵二叉树
DestroyBiTree:销毁-棵二二叉树
PreOrder :前序遍历二叉树
InOrder :中序遍历二叉树
PostOrder :后序遍历二叉树
LeverOrder :层序遍历=叉树
endADT
前序遍历
若二叉树为空,则空操作返回;否则:
(1)访问根结点
( 2 )前序遍历根结点的左子树
( 3 )前序遍历根结点的右子树
中序遍历
若二叉树为空,则空操作返回;否则:
( 1 )中序遍历根结点的左子树
(2)访问根结点
( 3 )中序遍历根结点的右子树
后序遍历
若二叉树为空,则空操作返回;否则:
( 1 )后序遍历根结点的左子树
( 2 )后序遍历根结点的右子树
(3)访问根结点
/********************************
二叉链表类BiTree的前序遍历
*********************************/
template
void BiTree :: PreOrder(BiNode *bt)
{
if (bt == nullptr) return; //递归调用的结束条件
else {
cout << bt->data; //访问根结点bt的数据域
PreOrder(bt->lchild); //前序递归遍历bt的左子树
PreOrder(bt->rchild); //前序递归遍历bt的右子树
}
}
/********************************
二叉链表类BiTree的中序遍历
*********************************/
template
void BiTree :: InOrder(BiNode *bt)
{
if (bt == nullptr) return; //递归调用的结束条件
else {
InOrder(bt->lchild); //前序递归遍历bt的左子树
cout << bt->data; //访问根结点bt的数据域
InOrder(bt->rchild); //前序递归遍历bt的右子树
}
}
/********************************
二叉链表类BiTree的后序遍历
*********************************/
template
void BiTree :: PostOrder(BiNode *bt)
{
if (bt == nullptr) return; //递归调用的结束条件
else {
InOrder(bt->lchild); //前序递归遍历bt的左子树
InOrder(bt->rchild); //前序递归遍历bt的右子树
cout << bt->data; //访问根结点bt的数据域
}
}