目录
前言
二叉树是一种树形结构,本章讨论二叉树的定义、二叉树的性质、二叉树的存储结构、二叉树的运算算法设计。
一、二叉树的定义
二叉树是有限的结点集合,这个集合或为空,或由一个根结点和两颗互不相交的称为左子树和右子树的二叉树组成。
需要注意的是,二叉树和树是两种不同的树形结构,不能认为二叉树就是度为2的树,差别如下:
(1)度为2的树至少有一个结点的度为2,也就是说度为2的树中至少有3个结点;而二叉树可以为空
(2)度为2的树中一个度为1的结点是不分左、右子树的;而二叉树中度为1的树是严格去问左、右子树的。
二、满二叉树和完全二叉树
1)满二叉树
在一颗二叉树中,如果所有分支结点都有左、右孩子结点,并且所有叶子结点都集中在最后一层,则该二叉树为满二叉树。
满二叉树的特点:
(1)叶子结点都在最下面一层。
(2)只有度为0和度为2的结点
(3)含n个结点的满二叉树的高度为,叶子结点的个数为
,度为2的结点个数为
。
2)完全二叉树
若二叉树中最多只有最下面两层的结点的度可以小于2,并且最下面一层的叶子结点都依次排列在该层最左边位置上,则这种二叉树称为完全二叉树。
完全二叉树的特点如下:
(1)叶子结点只可能出现在最下面两层中
(2)最下一层的叶子结点都依次排列在该层最左边的位置上
(3)如果有度为1的结点,只可能有一个,且该结点最多只有左孩子而无右孩子
(4)按层序编号后,一旦出现某编号为i的结点为叶子结点或只有左孩子,则编号大于i的结点均为叶子结点。
三、二叉树的性质
性质1:非空二叉树上叶子结点数等于双分支结点数加1
性质2:非空二叉树的第i曾最多有个结点
性质3:高度为h的二叉树最多有个结点
性质4:对完全二叉树中层序编号为i的结点有:
(1)若,即
,则编号为i的结点为分支结点,否则为叶子结点
(2)若n为奇数,则该二叉树的单分支结点数为0;若n为偶数,则只有一个单分支结点,该结点为编号最大的分支结点。
(3)若编号为i的结点有左孩子结点,则左孩子结点的编号为2i;若编号为i的结点有右孩子结点,则右孩子结点编号为2i+1。
(4)若编号为i的结点有双亲结点,其双亲结点的编号为。
性质5:具有n个结点的完全二叉树的高度为或
。
四、二叉树的存储结构
二叉树的存储结构主要有顺序存储结构和链式存储结构两种
1)二叉树的顺序存储结构
二叉树的顺序存储结构,就是用一组连续的存储单元存放二叉树中的结点。由性质4可知,对于完全二叉树和满二叉树,树中结点的层序可以反映出结点之间的逻辑关系。
例如,对上面图中的完全二叉树,对应的顺序存储结构如下:
为了使数组下标与结点编号一致,我们不适用下标为0的数组元素。
而对于一般的二叉树,我们要对其进行改造,增添一些并不存在的空结点,使其成为一颗完全二叉树的形式,再将其按编号存入数组,以‘#’代替空结点。
显然,顺序存储结构对于完全二叉树或满二叉树比较合适。在顺序存储结构中,查找一个结点的孩子、双亲结点都很方便。
2)二叉树的链式存储结构
二叉树的链式存储结构是指用一个链表来存储一颗二叉树,二叉树中的每一个结点用链表中的一个链结点来存储。在二叉树结点类中,不仅有存储数据元素的data变量,还有lChild和rChild用来表示左孩子和右孩子。这种链式存储结构通常称为二叉链
1.二叉链结点类
二叉链的结点类定义如下:
public class BTNode<E> {
E data; //存放数据元素
BTNode<E> lChild; //指向左孩子结点
BTNode<E> rChild; //指向右孩子结点
BTNode(){
lChild = null;
rChild = null;
}
BTNode(E data){
this.data = data;
lChild = null;
rChild = null;
}
}
2.二叉树类的设计
在二叉链中通过根结点root来表示唯一二叉树,对应的设计如下:
public class BTreeClass {
BTNode<Character> root; //根结点
String btStr; //二叉树括号表示串
public BTreeClass(){
root = null;
}
}
3.二叉树基本运算算法的实现
(1)创建二叉树:对于括号表示串btStr,我们用ch扫描btStr,其中只会有4类字符,分别进行处理:
1)) ch='(':表示前面创建的结点p存在孩子结点,需要将p进栈。然后开始处理p结点的左孩子,因此flag=true,表示下一个处理的结点为左孩子结点
2)) ch=')':表示以栈顶结点为根结点的子树创建完毕,将其退栈
3)) ch=',':表示开始处理右孩子结点,使flag=false
4)) 其他情况:创建一个新结点p,根据flag值建立p结点与栈顶结点的关系。
如此循环直至btStr处理完毕,代码如下:
public void creatBTree(String str){
Stack<BTNode> st = new Stack<BTNode>(); //建立栈st
BTNode<Character> p = null;