数据结构---树与二叉树
树和二叉树
树(Tree)是n(n>=0)个结点的有限集,它或为空树(n= 0); 或为非空树,只有根结点也是树
对于非空树T,有且仅有一个根结点,除根结点以外其余结点可分为m个互不相交的有限集,其中每一个集合本身又是一棵树,称为根的子树
树的结构定义是一个递归定义,在数的定义中又用到数的定义
树的表示形式
(a)嵌套集合的形式 (b)广义表的形式 (c)凹入表示法
树的基本术语
名称 | 概念 |
---|---|
结点 | 树中的一个独立单元。包含一个数据元素及若于指向其子树的分支 |
结点的度 | 结点拥有的子树数称为结点的度 |
树的度 | 树的度是树内各结点度的最大值 |
叶子 | 度为 0 的结点称为叶子或终端结点。 |
非终端结点 | 度不为 0 的结点称为非终端结点或分支结点。 |
双亲和孩子 | 结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲 |
兄弟 | 同一个双亲的孩子之间互称兄弟 |
祖先 | 从根到该结点所经分支上的所有结点 |
子孙 | 以某结点为根的子树中的任一结点都称为该结点的子孙 |
层次 | 结点的层次从根开始定义起,根为 第一层,根的孩子为第二层 |
堂兄弟 | 双亲在同 一层的结点互为堂兄弟 |
树的深度 | 树中结点的最大层次称为树的深度或高度 |
有序树和无序树 | 将树中结点的各子树看成从左至右是有次序的(即不能互换),则称该树为有序树,否则称为无序树 |
森林 | m (m>=0 )棵互不相交的树的集合 |
二叉树的定义
二叉树(Binary Tree)是n(n>=0)个结点所构成的集合,它或为空树(n= 0); 或为非空树
其中非空树T,有且仅有一个根结点,除根结点外其余结点分为两个互不相交的子集T1和T2,称为左子树和右子树,其中T1,T2本身又是二叉树
二叉树也具有递归的性质,和树最大区别在于1,二叉树中不存在度大于2 的结点2, 二叉树的子树有左右之分,其次序不能任意颠倒。
二叉树可以是空树,也可以是仅有根结点
二叉树并不是树,这是两个不同的概念
数据压缩问题---哈夫曼树
求解表达式的值---二叉树
树的抽象数据类型定义
树:
}
二叉树的抽象数据类型定义
二叉树:
}
二叉树的基本操作
初始化---创建只有根结点的二叉树
void InitBitree(BiTree *T)
{
*T=NULL;//将根结点置空
}
销毁二叉树
void DestroyBitree(BiTree *T)
{
if(*T)//确保根结点不为空
{
if((*T)->lchild)//当左子树不为空,递归销毁左子树
DestroyBitree(&((*T)->lchild));
if((*T)->rchild)//当右子树不为空,递归销毁1右子树
DestroyBitree(&((*T)->rchild));
delete(*T);//释放根结点
*T=NULL;//根结点置空,退出循环
}
}
清空二叉树
void ClearBitree(BiTree *T)
{
if(*T)//确保根结点不为空
{
if((*T)->lchild)
ClearBitree(&((*T)->lchild));//当左子树不为空,递归清空左子树
if((*T)->Rchild)
ClearBitree(&((*T)->Rchild));//当右子树不为空,递归清空右子树
*T=NULL;//根结点置空,根节点还存在
}
}
删除左子树
bool DelectLeftChild(BiTree p)
{
if(p)//左子树不为空
{
DestroyBitree(&(p->lchild));//递归销毁左子树,左子树的根结点也不存在
return 1;
}
return 0;
}