二叉树的基本概念
二叉树的定义:二叉树是n(n>=0)个结点构成的有限集合。当n=0时,它是一棵空二叉树;当n>0时,它由一个根节点和两棵互不相交的,分别称作左子树和右子树的二叉树构成。
(1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
(2)满二叉树——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
(3)平衡二叉树——平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
树的结点:包含一个数据元素及若干指向子树的分支;
孩子结点:结点的子树的根称为该结点的孩子;
双亲结点:2 结点是1 结点的孩子,则1结点是2结点的双亲;
兄弟结点:同一双亲的孩子结点; 堂兄结点:同一层上结点;
祖先结点: 从根到该结点的所经分支上的所有结点子孙结点:以某结点为根的子树中任一结点都称为该结点的子孙
结点层:根结点的层定义为1;根的孩子为第二层结点,依此类推;
树的深度:树中最大的结点层
结点的度:结点子树的个数
树的度: 树中最大的结点度。
叶子结点:也叫终端结点,是度为 0 的结点;
分枝结点:度不为0的结点;
有序树:子树有序的树,如:家族树;
无序树:不考虑子树的顺序;
二叉树的存储结构
二叉树的存储结构既有顺序存储结构,也有链式存储结构,但链式存储结构比较常用。
1.二叉树的顺序存储结构
就是用一组地址连续的存储单元依次存放二叉树的数据元素。数组中每个元素的下标与该元素在完全二叉树中相应结点的编号相对应,因此数组下标之间的关系也反映了二叉树中结点之间的逻辑关系。例如上图所示的完全二叉树可用一维数组表示,如下图所示
但是对于一般的非完全二叉树,若仍按从上到下从左到右的次序存储在一维数组中,则数组下标之间的关系不能反映二叉树中结点之间的逻辑关系。为了实现顺序存储,首先需要把非完全二叉树转换成完全二叉树。具体做法是为非完全二叉树增添一些实际上并不存在的“空结点”,使之成为完全二叉树形态,然后再按上述完全二叉树的顺序存储结构进行存储。存储时,”空结点 ”以空值存储。
很明显,对于完全二叉树,采用顺序存储结构比较合适,既能充分利用存储空间,又能简化二叉树的操作。但是对于一般的非完全二叉树,采用顺序存储结构,就会造成存储空间的浪费。
2.二叉树的链式存储结构
二叉树的链式存储结构是指用链表形式来存储二叉树。根据链表中每个节点指针域的数目又分为二叉链表和三叉链表。
(1)二叉链表
二叉链表是一种使用普遍的二叉树存储结构。它的结构简单,可方便的实现二叉树的大多数操作。缺点是不便于对双亲结点的操作。
(2)三叉链表
三叉链表是在二叉链表的基础上增加了指向双亲的指针域,从而解决了二叉链表对双亲操作不方便的问题。结点结构如下图所示: