这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战
每一个结点最多只有两棵子树,通常称这种树为二叉树。二叉树中严格区分左右孩子,其次序不能随意颠倒,否则,就变成了另一颗二叉树。因此,二叉树是有序树。
二叉树的定义
二叉树是n(n>=0)个结点的有穷集合D与D上关系集合R构成的结构。当n=0时,称该二叉树为空二叉树,否则,它便包含了一个根结点以及两棵不相交的、分别称为左子树与右子树的二叉树。
根据二叉树的定义,二叉树有5种基本形态:
- 空二叉树(用符号∮表示)
- 只有一个根结点而无子树的二叉树
- 只有左子树而无右子树的二叉树
- 只有右子树而无左子树的二叉树
- 左、右子树均非空的二叉树
二叉树的基本操作
INITIAL(BT)置BT为空二叉树ROOT(BT)或ROOT(x)求二叉树BT的根结点或者求结点x所在二叉树的根结点。若BT是空二叉树或者x不在二叉树上,则该操作返回“空”PARENT(BT,x)求二叉树BT中结点x的双亲结点。若x结点是二叉树BT的根结点或者二叉树BT中不存在x结点,则该操作返回“空”LCHILD(BT,x)和RCHILD(BT,x)分别求二叉树BT中结点x的左孩子和右孩子结点。若结点x为叶结点或者二叉树中不存在结点x,则该操作返回“空”LSIBLING(BT,x)和RSIBLING(BT,x)分别求二叉树BT中结点x的左兄弟和右兄弟结点。若结点x为二叉树的根结点,或者二叉树中不存在结点x,或者结点x是其双亲结点的左孩子(右孩子),则该操作返回“空”CREATEBT(x, LBT, RBT)生成一棵以结点x为根,分别以二叉树LBT和RBT为左子树和右子树的二叉树LINSERT(BT, x, y)和RINSERT(BT, x, y)将以结点y为根结点且右子树为空的二叉树分别置为二叉树BT中结点x的左子树和右子树。若结点x有左子树(右子树),则插入后作为结点y的右子树LDELETE(BT, x)和RDELETE(BT, x)分别删除二叉树BT中以结点x为根结点的左子树和右子树。若结点x无左子树或右子树,则该操作为空操作TRAVERSE(BT)按某种次序依次访问二叉树BT中的各个结点,并且每个结点只被访问一次,得到一个由该二叉树的所有结点组成的序列DESTROYBT(BT)销毁一颗二叉树。该操作删除二叉树BT中的所有结点,并释放他们的存储空间,使BT成为一颗空二叉树。LAYER(BT, x)求二叉树中结点x所处的层次DEPTH(BT)求二叉树BT的深度。若二叉树为空,则其深度为0;否则,其深度等于左子树与右子树中的最大深度加1
两种特殊形态的二叉树
- 满二叉树 如果一棵二叉树中的任意一个结点,或者是叶结点,或者有两棵非空子树,而且叶结点都集中在二叉树的最下面一层,这样的二叉树称为满二叉树。或者说,一棵深度为h且有2^h-1个结点的二叉树就是满二叉树。
- 完全二叉树 若二叉树中最多只有最下面两层结点的度可以小于2,并且最下面一层的结点(叶结点)都依次排列在该层最左边的位置上,具有这样的特点的二叉树称为完全二叉树