知识点来源于参考书籍《数据结构、算法与应用》,本人仅作整理与记录,方便日后复习查看。

左高树的定义:

设x是扩充二叉树的一个结点,并令left_child(x)和right_child(x)分别表示内部结点的左、右儿子。定义shortest(x)为从x到一个外部结点的最短路程长度。

令s (x)为从节点x到它的子树的外部节点的所有路径中最短的一条,根据s(x)的定义可知,

若x是外部节点,则s的值为0,若x为内部节点,则它的s值是:

其中L与R分别为x的左右孩子。

左高树是一棵二叉树,且如果该二叉树不空,则对其中的每个内部结点x,都有:

Shortest(left_child(x))>= Shortest(right_child(x))。

一棵二叉树称为高度优先左高树,当且仅当其中任何一个内部节点的左孩子的s值都大于或等于右孩子的S值。如果一颗HBLT同时还是大根树,则称为最大HBLT。如果一棵HBLT同时还是小根树,则成为最小HBLT。

一棵二叉树称为重量优先左高树,当且仅当其中任何一个内部节点的左孩子的W值都大于或等于右孩子的W值。(若x是内部节点,则他的重量是其孩子节点的重量之和加1).

    最大HBLT的插入: 最大HBLT的插入操作可利用最大HBLT的合并操作来实现,假定将元素x插入名为H的最大HBLT中。如果构建一棵仅有一个元素x的最大HBLT,然后将其与H进行合并,那么合并之后的最大HBLT将包括H的全部元素和元素x.。因此,要插入一个元素,可以先建立一棵新的只包含这个元素的HBLT,然后将这棵HBLT与原来的HBLT进行合并。

最大HBLT的删除:最大元素在根中。如果根本删除,则剩下左右孩子,然后以左右孩子为最大HBLT进行合并,便是删除后的结果。

两棵最大HBLT的合并(左高树中最重要的操作):合并策略最好采用递归来实现。令A、B为需要合并的两棵最大HBLT。若一个为空,则另一个便是合并后的结果。假设两者均不为空,为实现合并,先比较两个根元素,较大者作为合并后的根。假定A的根比较大,且左子树为L。令C是A的右子树与B合并而成的HBLT。A与B合并的结果是以A为根,以L和C为子树的最大HBLT。如果L的s值小于C的s值,则C为左子树,L为右子树。以下是合并两棵左高树的C++函数meld。该函数首先处理特殊情况:要合并的两棵树至少有一棵树为空。当两棵树都不为空时,要确保x的根元素大于y的根元素,否则x与y进行交换。接下来,通过递归,要将x的右子树与y进行合并。合并后,为保证结果是最大的HBLT,x的左右孩子可能需要交换,这时候需要计算s值。

template<class T>
void maxHblt<T>::meld(binaryTreeNode<pair<int,T>> * &x, binaryTreeNode<pair<int,T>> * &y)
{//合并分别以*x,*y为根的两棵左高树//合并后的左高树以x为根,返回x的指针if(y== NULL)return ;if(x==NULL){x = y;return;}//x和y均不为空,必要时交换x,yif(x->element < y->element){swap(x,y);}//将x的右子树与y进行合并meld(x->rightChild,y);//为保证结果是最大HBLT,需要计算子树的S值大小if(x->leftChild == NULL){//左子树为空,交换子树x->leftChild = x->rightChild;x->rightChild = NULL;x->element.first = 1;}else{if(x->leftChild->element.first < x->rightChild->element.first)swap(x->leftChild,x->rightChild);//右子树的s值小,故将右子树s值加一x->element.first = x->righChild->element.first+1; }}

  最大HBLT的初始化:初始化过程是将n个元素逐个插入最初为空的最大HBLT中,所需的时间为。为得到具有线性时间的初始化算法,我们首先创建n个仅含一个元素的最大HBLT,这n棵树组成一个FIFO队列,然后从队列中依次成对删除HBLT,然后将其合并后再插入到队列末尾,直到只有一个HBLT为止。以下是最大HBLT的初始化,代码用一个基于数组的FIFO队列保存在初始化过程中产生的最大HBLT。在第一个for循环中,产生了n个只有一个元素的最大HBLT,并将其插入到初试为空的队列中。在第二个for循环中,每次从队列中删除两个最大的HBLT进行合并,然后将结果加入队列中。当for循环结束后,队列中仅含有一棵最大HBLT。

template<class T>
void maxHblt<T>::initialize(T* theElements, int theSize)
{//用数组theElements[1:theSize]建立左高树arrayQueue<binaryTreeNode<pair<int,T>>*> q(theSize);erase();                           //使*this为空//初始化树的队列for(int i=1;i<=theSize;i++){//建立只有一个节点的树q.push(new binaryTreeNode<pair<int,T>>(pair<int,T>(1,theElements[i])));}//从队列中重复取出两棵树进行合并for(int i=1;i<=theSize-1;i++){//从队列中删除两棵树合并binaryTreeNode<pair<int,T>> *b = q.front();q.pop();binaryTreeNode<pair<int,T>> *c = q.front();q.pop();meld(b,c);//将合并后的树插入队列q.push(b);}if(theSize>0)root = q.front();treeSize = theSize;
}

其他方法:说明:在一棵最大HBLT中,节点的数据类型是binaryTreeNode<pair<int,T>>;pair的第一个成员是节点的s值,第二个成员是优先级队列元素。

template<class T>
void maxHblt<T>::meld(maxHblt<T> & theHblt )
{//将左高树*this与theHblt合并meld(root,theHblt.root);treeSize  = treeSize+theHblt.treeSize;theHblt.root = NULL;theHblt.treeSize = 0;
}template<class T>
void maxHblt<T>::push(const T& theElement )
{//建立只有一个元素的左高树,其实就是建立一棵二叉树binaryTreeNode<pair<int,T>> *q = new binaryTreeNode<pair<int,T>>(pair<int,T>(1,theElement));//将单元素左高树合并meld(root,q);treeSize ++;
}template<class T>
void maxHblt<T>::pop()
{if(root == NULL)throw queueEmpty();//树不空binaryTreeNode<pair<int,T>> *left = root->leftChild;binaryTreeNode<pair<int,T>> *right = root->rightChild;delete root;root = left;meld(root,right);treeSize--;
}

数据结构与算法之左高树相关推荐

  1. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 优先级队列 — 左高树

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 优先级队列 - 左高树 一.左高树 1.外部节点 2.高度优先左高树 (1)定义 (2)特性 (3)HBLT 与 大小根树 3. ...

  2. C++(数据结构与算法):42---优先级队列的实现(扩充二叉树、高度优先左高树(HBLT)、重量优先左高树(WBLT))

    本文代码下载: 方式1:公众号[多栖技术控小董]回复[3586]免费获取下载链接 方式2:CSDN下载链接:https://download.csdn.net/download/qq_41453285 ...

  3. (1小时数据结构)数据结构c++描述(十九) --- 最大左高树

    定义 [最大H B LT ] 即同时又是最大树的HBLT: [最小HBLT ] 即同时又是最小树的HBLT. 有关最大树的定义在上一章节有解析:传送门 堆树的定义 最大左高树合并:(重要知识点) 上图 ...

  4. 数据结构(十六)——左高树(含合并过程详细图解)

    文章目录 前言 左高树 什么是左高树? 为什么要使用左高树? 最大左高树实现及复杂度分析 节点类和最大左高树类 合并方法 插入(push).删除(pop) 初始化 左高树合并图解 前言 看到左高树的时 ...

  5. 数据结构——左高树(C语言)

    介绍左高树之前,先简单介绍下扩充二叉树的概念.扩充二叉树一棵二叉树,其所有空的子树都由方形结点代替.方形结点称为外部结点,原来的结点称为内部结点. 设x是扩充二叉树的一个结点,并令left_child ...

  6. 数据结构与算法(C++)– 树(Tree)

    数据结构与算法(C++)– 树(Tree) 1.树的基础知识 树(tree): 一些节点的集合,可以为空集 子树(sub tree): 树的子集 根(root): 树的第一个节点 孩子和父亲(Chil ...

  7. 高度优先左高树(HBLT) - C语言

    相关概念: 左高树(leftist tree)将树中的节点分为两类: 外部节点:用于代替树中的空子树:其余节点均叫做内部节点.内部节点就是我们所能看到的树中的每个真实节点,如果某个节点的左子树为空,那 ...

  8. 11_JavaScript数据结构与算法(十一)树

    JavaScript 数据结构与算法(十一)树 树结构 什么是树? 真实的树: 树的特点: 树一般都有一个根,连接着根的是树干: 树干会发生分叉,形成许多树枝,树枝会继续分化成更小的树枝: 树枝的最后 ...

  9. 数据结构与算法(C#实现)系列---树

    Heavenkiller(原创) 首先我们给树下一个定义: 树是一个有限的.非空的结点集, T={r} or T1 or T2 or-or Tn 它具有下列性质: 1.集合指定的结点r叫做树的根结点 ...

最新文章

  1. WPF 4 Ribbon 开发 之 快捷工具栏(Quick Access Toolbar)
  2. 排序算法的python实现
  3. 简单易用高性能!一文了解开源迁移学习框架EasyTransfer
  4. memcpy(cv::Mat.data,unsigned char *,320x240),保存数据失真问题解决方法
  5. (90)FPGA比较器设计
  6. 电影《你好,李焕英》进入全球票房榜前100
  7. 不懂网络和懂一点的区别
  8. Gridview模板中提供的删除功能
  9. 如何取消计算机的自动更新,电脑自动更新如何取消 电脑自动更新取消方法
  10. 编程菜鸟的日记-初学尝试编程递归
  11. Android下基于UVC的UsbCam的开发
  12. linux文件系统之mount流程分析
  13. idea复制web项目没有servlet选项
  14. 智能陈桥五笔7.8试用编号是多少_学霸的学习方法,听多少都不嫌多
  15. c语言scan例子,SCAN和C-SCAN算法图解
  16. Glide原生方法加载圆形图片
  17. 软件工程笔记四__实体联系图(ER图)
  18. 利用FME进行火星、百度坐标反算及误差分析
  19. 提速降费再发力 中国联通推出八项惠民便民措施
  20. 红米AX6S路由器刷OpenWrt固件,实现软路由功能,科学-上网-网速度起飞

热门文章

  1. 使用VS Code开发AngularJS 2 第一个应用程序
  2. 2017京东校招面试回忆 已成功拿到offer
  3. 计算机辅助设计软件应用答案,专科《计算机辅助设计软件地应用》_试卷_答案.docx...
  4. ZO1X(功能安全验证)介绍
  5. PostgreSQL入门
  6. 制作动态网站比较好用的软件工具
  7. 华为harmonyos 2.0,连接无限可能 华为HarmonyOS 2.0 正式发布
  8. 华为如何升级鸿蒙os,华为鸿蒙OS首批升级机型公布
  9. 华为鸿蒙os系统怎么更新不了,华为鸿蒙OS系统真的不是PPT!适配机型再更新:多款重磅旗舰可升级...
  10. arcgis 空间交集 计算_ArcGIS叠置分析之相交分析