您的位置:首页 > 其它

二叉树(Binary Tree)

2017-03-26 22:22 127 查看

二叉树(Binary Tree)

1. 二叉树的概念及其特点

二叉树是树形结构的一种重要类型。

二叉树是每个结点最多有两个子树的树结构,通常子树被称作“左子树(left subtree)“和“右子树(right subtree)”。

二叉树的子树有左、右之分,其子树的次序不能颠倒。

注:二叉树是递归定义的,分支数最大不超过2的有根有序树。

2. 二叉树的五种不同形态

空二叉树,一个结点也没有,如图(1)。

只有一个根结点的二叉树,根的左子树和右子树都为空,如图(2)

只有左子树,根的右子树为空,如图(3)

只有右子树,根的左子树为空,如图(4)

完全二叉树,根的两棵子树都不为空,如图(5)



3. 二叉树的性质

在非空二叉树的第i(i≥1)层最多有2i−1个结点。

深度为k(k≥0)的二叉树最少有k个结点,最多有2k-1个结点。

对任何一棵非空二叉树,如果其叶结点数为n0,度为2的非叶结点总数为n2,则n0=n2+1。

4. 特殊的二叉树

注:满二叉树一定是完全二叉树,但是完全二叉树不一定是满二叉树。哈夫曼树只是一棵最优二叉树,不一定是完全二叉树,也不一定是平衡二叉树,哈夫曼树不关注树的结构,只关注带权路径长度。

4.1 满二叉树(full binary tree)

定义:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。

特点:

(1)深度为k的满二叉树是有2k-1个结点。

(2)在满二叉树中,每一层结点都达到最大个数2i−1(i为层数,i≥1)。

(3)除最底层结点的度为0外,其他各层结点的度都为2。

(4)具有n个结点的满二叉树的深度k=log2(n+1)。

4.2 完全二叉树(complete binary tree)

定义:只有最下面的两层结点度能够小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。

特点:

(1)一棵具有n个结点深度为k的二叉树,它的每一个结点都与高度为k的满二叉树中编号为1~n的结点一一对应。

(2)从第1层到第k-1层的所有各层的结点数都是满的(即第i层的结点总数为2i−1(i≥1)),仅最下面第k层或是满的,或从右向左连续缺若干结点。

(3)具有n个结点的完全二叉树的深度k=⌈log2(n+1)⌉(即k−1<log2(n+1)≤k,n≥0),或k=⌊log2n⌋+1(即k−1<(log2n)+1≤k,n>0)。

(4)如果将一棵有n个结点的完全二叉树(同样适用于满二叉树)自顶向下,同一层自左向右连续给结点编号1,2,3,……,n,然后按此结点编号将树种各结点顺序地存放于一个一维数组中,并简称编号为i的结点为结点i(1≤i≤n),则有以下关系:

*若i==1,则结点i为根,无父结点。

*若i>1,则结点i的父结点为结点⌊i/2⌋。

*若2*i≤n,则结点i的左子女为结点2*i。

*若2*i+1≤n,则结点i的右子女为结点2*i+1。

*若结点编号i为奇数,且i!=1,它处于右兄弟位置,则它的左兄弟为结点i-1。

*若结点编号i为偶数,且i!=n,它处于左兄弟位置,则它的右兄弟为结点i+1。

*结点i所在层次为⌊log2i⌋+1。

注:向下取整的运算称为Floor,用数学符号⌊⌋表示;向上取整的运算称为Ceiling,用数学符号⌈⌉表示。

4.3 平衡二叉树(balanced binary tree)

定义:平衡二叉树简称为平衡树,是由Adelson-Velskii和Landis于1962年首先提出的,所以又称为AVL树(有别于AVL算法)。

特点:

(1)它是一 棵空树,或是一棵每个左右结点的高度差最多相差1的二叉树,就是平衡二叉树。

(2)左右两个子树都是一棵平衡二叉树。

(3)把二叉树的每个节点的左子树减去右子树定义为该结点的平衡因子,且二叉平衡树的平衡因子只能是1、0或者-1。

4.4 最优二叉树——哈夫曼树(Huffman Tree)

5. 二叉树的存储结构

5.1 二叉树的数组存储表示

适用情况:在数据处理过程中,二叉树的大小和形态不发生剧烈的动态变化时,适宜采用数组方式来表示二叉树的抽象数据类型。

方法:将二叉树的数据元素存储在一组连续的存储单元之内,用数组元素的下标为索引,随机存取二叉树的结点。

特点:这种存储方案必须兼顾树形结构的特点,使各结点能够方便地定位到它的父结点和左、右子女。

完全二叉树的数组存储表示:

(1)设有一棵结点总数为n的完全二叉树T,对T的所有结点按照层次次序自上向下,同一层自左向右顺序编号1,2,……,n,就得到一个结点的顺序(线性)序列,在数组BinTree.data[i]中存放编号为i的完全二叉树结点。

(2)采用这种方式,可以利用完全二叉树的特点(4),从一个结点的编号推算出它的父、子女、兄弟等结点的编号,从而找到这些结点。

注:这种存储表示是存储完全二叉树的最简单、最省存储的存储方式。

一般二叉树的数组存储表示:

(1)设有一棵结点总数为n的一般二叉树T,对T的所有结点按照层次次序自上向下,同一层自左向右顺序编号,在编号时,遇到空子树,应假定有此子树,不过此子树的内容为空,进行编号,原理跟完全二叉树相同。

注:这样做的弊端是,有可能会浪费大量的存储空间。



5.2 二叉树的链表存储表示

适用情况:数组表示法用于完全二叉树的存储表示非常有效,但表示一般二叉树,尤其是形态剧烈变化的二叉树,存储空间的利用不很理想。因此,在数据处理过程中,二叉树的大小或形态发生剧烈的动态变化时,适宜采用链表方式来表示二叉树的抽象数据类型。

方法:

(1)根据二叉树的定义,二叉树的每一个结点可以有两个分支,分别指向结点的左、右子树。

(2)二叉树的结点至少包括三个域,分别存放结点的左子女结点指针leftChild、数据data和右子女结点指针rightChild,这种链表结构称为二叉链表。

(3)当二叉树的结点包括四个域时,分别存放结点的左子女结点指针leftChild、数据data、父节点parent和右子女结点指针rightChild,这种链表结构称为三叉链表。

(4)整个二叉树的链表有一个表头指针,它指向二叉树的根结点,其作用是当作树的访问点。

特点:

(1)二叉链表的特点:可以很方便地根据结点leftChild指针和rightChild指针找到它的左子女结点和右子女结点,但要找到它的父节点很困难。

(2)三叉链表的特点:可以很方便地根据结点leftChild指针、parent指针和rightChild指针找到它的左子女结点、父节点和右子女结点。

6. 二叉树的抽象类定义——应用了模板类来描述二叉树抽象数据类型

文件:BinTreeNode.h



文件:BinaryTree.h



参考文献:

[1]《数据结构(用面向对象方法与C++语言描述)(第2版)》殷人昆——第五章

[2] 百度搜索关键字:二叉树、满二叉树、完全二叉树、平衡二叉树
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: