二叉树
来源:互联网 发布:linux iostat命令详解 编辑:程序博客网 时间:2024/05/21 22:38
提前声明:二叉树不是树的一种特殊形式,树与二叉树是两种不同的树形结构
二叉树是数据结构中重要的一部分,方便了数据的存储和查找,此博客就软考大纲中要求掌握的二叉树的内容做一个总结.
1、二叉查找树(二叉排序树)
性质:
(1)若它的左子树不为空,则左子树上的所有节点的值都小于它的根节点的值;
(2)若它的右子树不为空,则右子树上所有节点的值都大于它的根节点的值;
(3)其他的左右子树也分别为二叉查找树;
(4)二叉查找树是动态查找表,在查找的过程中可见添加和删除相应的元素,在这些操作中需要保持二叉查找树的以上性质。
查找步骤:
- 若根结点的关键字值等于查找的关键字,成功。
- 若小于根结点的关键字值,递归查左子树。
- 若大于根结点的关键字值值,递归查右子树。
- 若子树为空,查找不成功。
因为含有相同节点的二叉查找树可以有不同的形态,而二叉查找树的平均查找长度与树的深度有关,所以需要找出一个查找平均长度最小的一棵二叉树
就是为了解决这个问题,我们引入平衡二叉树
2、平衡二叉树(AVL树)
性质:
(1)要么是棵空树,要么其根节点左右子树的深度之差的绝对值不超过1;
(2)其左右子树也都是平衡二叉树;
(3)二叉树节点的平衡因子定义为该节点的左子树的深度减去右子树的深度。则平衡二叉树的所有节点的平衡因子只可能是-1,0,1。
这里对平衡二叉树做一个了解就可以,二叉树向平衡二叉树的转换我就先不在这做解释了
3.Huffman树
它是最优二叉树,是二叉树中带权路径长度最小的二叉树
解释:
- 路径是从树中一个节点到另一个节点之间的通路,路径上的分支数目称为路径长度
- 树的路径长度:从树根到每一个叶子之间的路径长度之和.
- 节点的带权路径长度:从该节点到树根之间的路径长度与改点权的乘积.
- 树的带权路径长度:所有叶子节点的带权路径长度之和
构建Huffman树(通过例子来学习):
如:给出5个节点A,B,C,D,E和它们的权重分别为 5,50,10,30,20
步骤:
(1)将各个节点按照权重从小到大排序;
A(5),C(10),E(20),D(30),B(50)
(2)去最小权重的两个节点,并新建一个父节点作为这两个节点的双亲,双亲节点的权重为子节点权重之和,再将此父节点放入原来的队列;
第一次找到的两个节点为A和C,则其父节点T1的权重为5+10=15,此时节点的排序为T1(15),E(20),D(30),B(50)
(3)重复(2)的步骤,直到队列中只有一个节点,此节点为根节点;
构造出的哈夫曼树为
Huffman编码
Huffman是一种前缀编码;
Huffman编码是建立在Huffman树的基础上进行的,因此为了进行Huffman编码,必须先构建Huffman树;构造完Huffman树之后,就可以进行Huffman编码了
拿上边构造的Huffman树C图为例,对其进行编码
步骤:
(1)左分支填0,右分支填1;
(2)如果要编码A,则沿着树的路径编码,最后编码结果为1100;
要对B编码,结果为0;
要对D编码,结果为11;
…….
4.简单了解一下什么是B-树,什么是B+树
B-树
B-树是一种平衡多路查找树,它在文件系统中很有用。一棵m阶B-树(图d为4阶B-树),具有下列性质:
(1)树中每个节点至多有m棵子树;
(2)若根节点不是叶子节点,则至少有2棵子树;
(3)除根节点之外的所有非终端节点至少有对m/2上取整棵子树 ;
(4)每个节点中的信息结构为(A0,K1,A1,K2......Kn,An),其中n表示关键字个数,Ki为关键字,Ai为指针;
(5)所有的叶子节点都出现在同一层次上,且不带任何信息,也是为了保持算法的一致性。
B+树
B+数是B-树的一种变形,它与B-树的差别在于(图e为3阶B+树):
(1)有n棵子树的节点含有n个关键字;
(2)所有的叶子节点包含了全部关键字的信息,及指向这些关键字记录的指针,且叶子节点本身按关键字大小自小到大顺序链接;
(3)所有非终端节点可以看成是索引部分,节点中仅含有其子树(根节点)中最大(或最小)关键字,所有B+树更像一个索引顺序表;
(4)对B+树进行查找运算,一是从最小关键字起进行顺序查找,二是从根节点开始,进行随机查找。
5.二叉树的存储结构
(1)顺序存储:只适用于完全二叉树;
(2)链式存储:最通用的存储方法;
但是这样很浪费空间,因为会有很多空指针(如果有n个节点,则有2n个left、right指针,但是用到的只有n-1个指针)
改进:线索二叉树:将空指针链接到前驱或后继节点;(此处前驱和后继是按照中序遍历上讲的)
节点数据结构如下图:
6.二叉树的遍历
(1)前序遍历(与树的前序遍历一致):先双亲、再左孩子、最后右孩子;
(2)中序遍历(与树的后序遍历一致):先左孩子、再双亲、最后右孩子;
(3)后序遍历:先左孩子、再右孩子、最后双亲;
(4)层次遍历:一层一层,从左到右、从上到下遍历;
注意:
(1)已知前序、后序遍历结果,不能推导出一棵确定的树;
(2)已知前序、中序遍历结果,能够推导出后序遍历结果;
(2)已知后序、中序遍历结果,能够推导出前序遍历结果;
7.树与二叉树的转换
- 如果某结点的孩子结点大于2则只留左孩子结点,将其他与子节点的连线都删掉;否则都留着
- 将兄弟结点连接起来
- 调整
这是我对二叉树 相关知识的理解,如有不对的地方请大家帮忙指出,谢谢!
- 二叉树、二叉堆
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 程序员的emacs配置大全(cedet+ecb+cscope+gdb-ui)-jzj
- HOOK钩子详细介绍
- java 层生成文件如csv,在excel中打开乱码
- android java.net.SocketException: Connection reset by peer
- C/C++中const关键字详解
- 二叉树
- 对称排序(稳定排序问题)
- 动态输入日期与时间
- 基于STM32F103的悬挂运动控制系统项目总结
- POJ 3321 - Apple Tree DFS出时间搓,树状数组统计维护..
- hdu 4455 Substrings 预处理+递推
- JavaIO之标准输入输出(二)
- magento常用函数列表
- Linux2.6.6 内核下 ACPI PCI Hot-Plug 的实现机制(上)