数据结构---树与二叉树

树和二叉树

树(Tree)是n(n>=0)个结点的有限集,它或为空树(n= 0); 或为非空树,只有根结点也是树

对于非空树T,有且仅有一个根结点,除根结点以外其余结点可分为m个互不相交的有限集,其中每一个集合本身又是一棵树,称为根的子树

树的结构定义是一个递归定义,在数的定义中又用到数的定义

image-20220124202723193

树的表示形式

(a)嵌套集合的形式 (b)广义表的形式 (c)凹入表示法

树的基本术语

名称 概念
结点 树中的一个独立单元。包含一个数据元素及若于指向其子树的分支
结点的度 结点拥有的子树数称为结点的度
树的度 树的度是树内各结点度的最大值
叶子 度为 0 的结点称为叶子或终端结点。
非终端结点 度不为 0 的结点称为非终端结点或分支结点。
双亲和孩子 结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲
兄弟 同一个双亲的孩子之间互称兄弟
祖先 从根到该结点所经分支上的所有结点
子孙 以某结点为根的子树中的任一结点都称为该结点的子孙
层次 结点的层次从根开始定义起,根为 第一层,根的孩子为第二层
堂兄弟 双亲在同 一层的结点互为堂兄弟
树的深度 树中结点的最大层次称为树的深度或高度
有序树和无序树 将树中结点的各子树看成从左至右是有次序的(即不能互换),则称该树为有序树,否则称为无序树
森林 m (m>=0 )棵互不相交的树的集合

二叉树的定义

二叉树(Binary Tree)是n(n>=0)个结点所构成的集合,它或为空树(n= 0); 或为非空树

其中非空树T,有且仅有一个根结点,除根结点外其余结点分为两个互不相交的子集T1和T2,称为左子树和右子树,其中T1,T2本身又是二叉树

二叉树也具有递归的性质,和树最大区别在于1,二叉树中不存在度大于2 的结点2, 二叉树的子树有左右之分,其次序不能任意颠倒。

二叉树可以是空树,也可以是仅有根结点

二叉树并不是树,这是两个不同的概念

数据压缩问题---哈夫曼树

求解表达式的值---二叉树

树的抽象数据类型定义

树:

image-20220124210044197

}

二叉树的抽象数据类型定义

二叉树:

image-20220124210430755

image-20220124210558960

}

二叉树的基本操作

初始化---创建只有根结点的二叉树

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;
}

posted on 2022-02-06 20:25  眉目作山河  阅读(110)  评论(0编辑  收藏  举报

导航