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

左高树的定义:

设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. 直接拿来用!CTO 创业技术栈指南
  2. Python-random模块-59
  3. 欧几里德与扩展欧几里德算法——密码学笔记(五)
  4. 【工作相关】公子龙:工作后我变强了,暂时没秃
  5. 字节跳动的首款获批游戏曝光 原来是这个
  6. 加拿大计算机硕士gpa不够,加拿大研究生留学申请者绩点低怎么办?这四类应对方法你都知道吗?...
  7. 力扣-724 寻找数组的中心索引
  8. day 3 - 1 数据类型
  9. XLSTransformer生成excel文件案例
  10. 74cms php在那个文件夹里面,74cms骑士人才网站系统 v5.0/v5.1后台目录地址修改教程...
  11. RPLIDAR A1激光雷达学习笔记
  12. wps ppt 如何批量换背景
  13. 微信支付-简易实例代码
  14. 基于ThinkPhp6+Vue+AntDesign前后端分离极速开发平台
  15. 【云计算的1024种玩法】搭建 wiki 知识库
  16. python中的异常、模块、文件
  17. Spring整合axis2
  18. 连续仨月霸占牛客榜首!京东T8呕心巨作:700页JVM虚拟机实战手册
  19. Caching best practices max-age
  20. GatewayWorker 与 Workerman的关系

热门文章

  1. android 铃声设置失败,无法通过Android代码设置铃声
  2. 炎炎夏日送清凉 狠抓实干保工期 西安华南城领导慰问工地一线建筑工人
  3. 计算并输出最高分及其学生学号
  4. R语言绘图、高清保存、以及颜色系统
  5. 京浜光电IPO被终止:曾拟募资7.1亿 实控人已改为日本籍
  6. C#垃圾回收机制GC
  7. 支付宝微信个人免签支付
  8. 【论文阅读】Phase-aware speech enhancement with deep complex U-net
  9. 移动魔百和系统升级服务器地址,中国移动魔百盒网络连接图文教程
  10. Python数据分析练习:北京、广州PM2.5空气质量分析(1)