从0开始学习数据结构-树与二叉树-二叉树

170 阅读3分钟

这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战

每一个结点最多只有两棵子树,通常称这种树为二叉树。二叉树中严格区分左右孩子,其次序不能随意颠倒,否则,就变成了另一颗二叉树。因此,二叉树是有序树

二叉树的定义

二叉树是n(n>=0)个结点的有穷集合D与D上关系集合R构成的结构。当n=0时,称该二叉树为空二叉树,否则,它便包含了一个根结点以及两棵不相交的、分别称为左子树与右子树的二叉树。

根据二叉树的定义,二叉树有5种基本形态:

  • 空二叉树(用符号∮表示)
  • 只有一个根结点而无子树的二叉树
  • 只有左子树而无右子树的二叉树
  • 只有右子树而无左子树的二叉树
  • 左、右子树均非空的二叉树

image.png

二叉树的基本操作

  • 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,并且最下面一层的结点(叶结点)都依次排列在该层最左边的位置上,具有这样的特点的二叉树称为完全二叉树

image.png

二叉树的性质 ※

image.png