`

常用二叉树

阅读更多
常用二叉树包括:二叉搜索树、堆、哈夫曼树、平衡二叉搜索树等
1、二叉搜索树(binary searching tree)又称二叉查找树,具有下列特性:
(1)左子树若非空,则左子树上所有节点的关键字均小于根节点的关键字;
(2)右子树若非空,则右子树上所有节点的关键字均大于根节点的关键字;
(3)左、右子树本身又是一个二叉搜索树;
时间复杂度为O(log2 n),最差的时候是O(n),在二叉搜索树上查找比在集合或线性表上进行顺序查找的时间复杂度O(n)要好得多,二叉搜索树查找算法的空间复 杂度为O(1)。
二叉搜索树的删除结点的操作过程:
(1)删除叶子结点
此种删除操作很简单,只要将其双亲结点链接到它的指针去掉(即置为空)即可。
(2)删除单支结点
此种删除操作比较简单,因为该节点只有左子树或右子树一支,也就是说,其后继只有左孩子或右孩子一个。删除该结点是,只要将唯一的一个后继指针链接到它所在的链接位置即可。
(3)删除双支结点(关键是找他的前驱节点)
这种删除比较复杂,因为待删除的结点有两个后继指针,需要妥善处理。删除这种结点的常用方法是:首先把她的中序前驱结点(即中序序列中处于它前面的一个结点,该结点是其左子树中最右下的一个结点)的值赋给该结点的值域,然后再删除它的中序前驱结点,因它的中序前驱结点的右指针必为空,所以只要把中序前驱结点的左指针链接到中序前驱结点所在的位置即可。
2、堆(heap)
堆分为大根堆和小根堆。小根堆的特征:
(1)若树根节点存在左孩子,则根节点的值小于等于左孩子结点的值;
(2)若树根结点存在右孩子,则根节点的值也小于等于右孩子结点的值;
(3)以左孩子、右孩子为根的子树右个是一个堆;
大根堆的特征只是把条件改为“大于等于”即可。
堆是满足一定条件的完全二叉树(除最后一层以外全部满,最后一层从左到右排列,可以不满)。因为堆是完全二叉树所以适宜用顺序存储的方式。
向堆中插入一个元素:首先将该元素写入到堆尾,即堆中最后一个元素的后面,然后经调整为一个新堆。由于在原有对上插入一个新元素后,可能使以该元素的双亲结点为根的子树不为堆,从而使得整个树不为堆,所以必须调整使之成为一个堆。调整的方法很简单,若新元素小雨双亲结点的值,就让他们互换位置;新元素换到双亲位置后,使得以该位置为根的子树成为堆,但新元素可能还小于此位置的双亲结点的值,从而使上一层的双亲结点为根的子树不为堆还需按照上述方法继续调整,这样传递上去,直到以新位置的双亲结点为根的子树仍为一个堆或者调整到堆顶为止,从而得到整个完全二叉树。
在堆中删除一个元素就是删除堆顶的元素,留下的堆顶位置有堆尾元素填补,这样可以保持顺序存储的结构特点有不需要移动其他任何元素。具体操作是:将堆尾元素换到堆顶时,可能造成不为堆的情况,需要调整。将堆顶元素与他的两个子结点中的最小值比较,若大于他们中的最小值则与其对换,直到调整后的位置为根的子树成为一个堆或者调整到叶子结点为止。
堆中插入、删除等操作的时间复杂度是O(log2 n),最多为整个树的深度减一。
因为堆是完全二叉树,所以可以用递归的方法将其输出其时间复杂度为O(n),空间复杂度O(log 2 n);
3、哈夫曼树Huffman Tree(最优二叉树)
树的带权路径长度规定为从树根结点到该结点之间的路径长度与该结点上权值的乘机和。
哈夫曼树是n个带全叶子结点构成的所有二叉树中带权路径长度(WPL)最小的二叉树。(权值越大的节点离树根越近的二叉树是最优二叉树)。
构造哈夫曼树的叙述:
(1)根据与n个权值对应的n个节点构成具有n棵二叉树的森林F={t1,t2,...tn},每棵二叉树都只有一个权值的根节点,其左右子树均为空。
(2)在森林F中选出两颗根节点的权值最小的树作为一颗新的树的左右子树,且置新树的根节点的权值为其左右子树上根节点的权值之和。
(3)从F中删除构成新树的两棵树,并加入新的树到F中。
(4)重复(2)、(3)步每次减少一棵树,直到F中只含有一棵树为止,即得到所求的哈夫曼树。(过程中产生的新的树的权值如果跟旧的树的权值一样,则旧的树先参加消除,我的理解是这样可以减少编码长度,树的深度会减少)
在每一颗哈夫曼树中只存在双支结点和叶子结点,若叶子结点为n个,则双支结点必为n-1;
在编码中,采用等长编码时,传送电文的总长度会很大,若采用不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样可以缩短传送电文的总长度。不等长编码需要避免译码的二义性或多义性,需要使用无前缀编码,即只有当一个结点是另一个节点的双亲是,该结点的字符编码才会是另一个结点的字符比编码的前缀。
4、平衡二叉树(balanced binary tree)
该树是对二叉搜索树的改进。定义:若一颗二叉树中每个节点的左右子树的高度至多相差1,则称该树为平衡树。 每个节点的平衡因子只能是0,1,-1。
具有n个结点的平衡树高度在任何情况下绝不会比具有相同节点数的理想平衡树高出45%,因此,在平衡树上进行查找运算虽然比理想平衡树要慢一些,但通常比任意生成的二叉排序树快得多,时间复杂度的数量级任然是O(log2 n);
当向平衡树中插入一个结点后破坏了其平衡性,则首先找出唯一一个最小不平衡子树,然后再调整整个子树中有关结点之间的连接关系,使之成为新的平衡子树。
最小不平衡子树是离插入节点最近、且平衡因子绝对值大于1的结点做根的子树
0
1
分享到:
评论

相关推荐

    08 常用二叉树-堆(4学时).docx

    在计算机科学中,二叉树是一种重要的数据结构,它们在许多算法和应用中扮演着核心角色。本教学单元主要关注一种特殊的二叉树——堆,它在数据结构中有着广泛的应用,比如堆排序和优先队列。堆通常分为两种类型:最大...

    【课件】5.2.1_1二叉树的定义和基本术语.pdf

    3. **编译原理**:语法分析树、抽象语法树等在编译器设计中常用二叉树来表示程序的结构。 4. **文件系统**:文件系统的目录结构可以被看作是二叉树的一种形式。 5. **网络路由**:路由表中的路由条目也可以用二叉树...

    二叉树常用算法 c++

    在C++中,实现二叉树的常用算法包括遍历、插入和删除操作,这些是理解和掌握数据结构基础的关键部分。 **1. 二叉树遍历** 遍历是访问二叉树所有节点的过程,通常分为三种主要方法:前序遍历、中序遍历和后序遍历。 ...

    常用算法链表堆栈二叉树.docx

    今天我们主要讨论链表、栈和二叉树这三种数据结构,并介绍一些常用的算法。 一、链表 链表是一种动态的数据结构,每个结点都包含了一个值和一个指向下一个结点的指针。链表可以实现插入、删除、查找等操作。 1. ...

    二叉树和图的常用算法操作.zip

    这个“二叉树和图的常用算法操作”压缩包可能包含了关于这两种数据结构的一些基础和进阶操作的实现,旨在帮助学习者深入理解和应用这些概念。 首先,我们来看二叉树。二叉树是一种特殊的树形数据结构,其中每个节点...

    二叉树实验三 二叉树的综合操作

    1. **二叉链表结构**:要求使用二叉链表结构来建立二叉树,这是一种常用的数据结构,用于表示二叉树中的节点关系。 2. **遍历结果展示**:实现并展示先序、中序、后序和层序遍历的结果。其中,至少一种遍历方式需...

    二叉树求四则运算

    在数据结构中,二叉树是一种常用的数据结构,它可以用来解决各种问题,例如四则运算。在本实验中,我们使用C/C++语言实现了一个二叉树求四则运算的程序。 首先,我们定义了一个Node类,它用于表示二叉树中的每个...

    二叉树的递归算法:建立二叉树、遍历二叉树

    递归算法是解决二叉树问题的一种常用方法,通过递归调用函数自身来处理二叉树的节点,直到达到叶子节点(没有子节点的节点)。递归算法简洁且直观,非常适合处理树形结构的数据。 #### 三、二叉树的创建与遍历 在...

    二叉树面试题 树和二叉树总结.doc

    树和二叉树都是计算机科学中常用的数据结构。 二、树和二叉树的性质 树和二叉树都有其特定的性质,例如树的高度、深度、叶子节点数、度数等。这些性质在树和二叉树的操作和应用中扮演着重要的角色。 三、树和...

    二叉树的中序线索化和遍历

    在计算机科学中,二叉树是一种常用的数据结构,它可以用来存储和管理大量的数据。然而,在某些情况下,我们需要对二叉树进行遍历,以便获取其中的数据。在这种情况下,二叉树的中序线索化和遍历便成了一个重要的问题...

    二叉树模版

    5. **并查集(UFSets)**:虽然不是二叉树的一种,但它是处理离散化问题时常用的数据结构,可以用来表示一组不相交集合的联合和查找操作。在二叉树的一些问题中,如寻找最近公共祖先、判断两节点是否在同一子树等,...

    53152-数据结构(Python语言描述)(微课版)-教案.zip.zip

    4. **常用二叉树——哈夫曼树(2学时)**:哈夫曼树是一种特殊的二叉树,用于数据编码和压缩,它具有最小带权路径长度,对理解数据压缩原理至关重要。 5. **常用二叉树——堆(4学时)**:堆是一种特殊的完全二叉树,...

    数据结构试验3二叉树建立,遍历等

    **二叉链表定义**:二叉链表是二叉树最常用的存储结构之一,它使用链式存储结构来存储二叉树。每个节点由三部分组成:数据域(用于存储节点的实际数据)、指向左孩子的指针和指向右孩子的指针。 **示例代码**: ```...

    二叉树的常用算法的实现

    本主题聚焦于C++实现的二叉树常用算法,我们将深入探讨二叉树的定义、性质、构建以及一些核心操作。 二叉树是由节点(或称为结点)构成的数据结构,每个节点最多有两个子节点,通常分为左子节点和右子节点。二叉树...

    常用数据结构 -- 二叉树

    在IT领域,数据结构是计算机...对于深入学习,可以参考给定的文档“常用数据结构--线性结构&二叉树.docx”,它可能包含了更多关于线性结构和二叉树的详细信息,包括示例代码和实例解析,帮助你更好地掌握这些关键知识。

    二叉树的二叉链表存储表示

    二叉树的存储表示是指将二叉树存储在计算机中的一种方式,其中二叉链表存储表示是一种常用的存储方式。 二叉链表存储表示是指每个结点都包含一个数据域和两个指针域,左指针域指向左子树,右指针域指向右子树。这种...

    算法大全-面试题-链表-栈-二叉树-数据结构

    二叉树分为完全二叉树、满二叉树和平衡二叉树等类型。二叉搜索树(BST)是一种特殊的二叉树,其中每个节点的左子树只包含小于当前节点的元素,右子树包含大于当前节点的元素,这使得搜索、插入和删除操作非常高效。...

    构建二叉树的二叉链表存储结构

    二叉链表存储结构是二叉树常用的一种存储方式,它通过节点的数据域和两个指针域分别指向左子节点和右子节点来实现二叉树的逻辑结构。本文重点讨论了四种构建二叉树二叉链表存储结构的方法。 1. **利用扩展二叉树的...

Global site tag (gtag.js) - Google Analytics