定义

[最大H B LT ] 即同时又是最大树的HBLT; [最小HBLT ] 即同时又是最小树的HBLT。

有关最大树的定义在上一章节有解析:传送门 堆树的定义

最大左高树合并:(重要知识点)

上图是,合并的过程:

  • a b c 是一组,当没有左子树的时候,要把右边的树给变到左边。
  • d e 是一组,当节点小于root节点,先放到右边,这个时候左边有节点,不变。
  • f  g h 是一组, i  j  k 是一组,上面的过程就是合并的过程

代码部分:

/*
数组结构中  最大左高树对应书中代码:数据结构算法与应用c++描述程序编写:比卡丘不皮编写时间:2020年7月21日 14:49:13
*/
#pragma once
#include <iostream>
#include "all_error.h"
#include "Queue.h"
using namespace std;template<class T>
class MaxHBLT;template<class T>
class HBLTNode
{friend MaxHBLT<T>;
public:HBLTNode(const T & e, const int sh){data = e;s = sh;LeftChild = RightChild = 0;}
private:int s; //节点的s值 0代表没有数据T data; HBLTNode<T> *LeftChild, *RightChild; //左右树
};template<class T>
void Swap(HBLTNode<T>* & L, HBLTNode<T>* & R)
{HBLTNode<T>* p = L;L = R;R = p;
}template<class T>
class MaxHBLT
{
public:MaxHBLT() { root = 0; }~MaxHBLT() { Free(root); }T Max(){if (!root){throw OutOfBounds();}return root->data;}MaxHBLT<T> & Insert(const T & x);MaxHBLT<T> & DeleteMax(T & x);MaxHBLT<T> & Meld(MaxHBLT<T> & x){Meld(root, x.root);x.root = 0;return *this;}void Initialize(T a[], int n); //数组规划成最大左高树void LevelOrder();  //逐层遍历输出函数
private:void Free(HBLTNode<T> *t);void Meld(HBLTNode<T>* &x, HBLTNode<T>* y);HBLTNode<T> *root; // 指向树根的指针
};

定义节点,与对应的类,就比最大堆中多了个int s的变量。这个变量决定了是否左右子树互相变换。

Swap  函数为了交换指针方便,书中没有详细去写,这里为补充。

包含的头文件是队列的定义:队列的定义,或你可以使用stl 中的queue来代替;

Meld合并函数:

这个函数是重点,后面的操作都需要这个函数:

template<class T>
void MaxHBLT<T>::Meld(HBLTNode<T>*& x, HBLTNode<T>* y)
{// 合并两棵根分别为* x和 * y的左高树// 返回指向新根 x的指针if (!y){return;}if (!x){x = y;return;}//x y 均不为空if (x->data  < y->data){Swap(x, y);}//现在 x->data >= y->dataMeld(x->RightChild, y);if (!x->LeftChild) //左子树为空{// 交换子树x->LeftChild = x->RightChild;x->RightChild = 0;x->s = 1;}else{// 检查是否需要交换子树if (x->LeftChild->s < x->RightChild->s){Swap(x->LeftChild, x->RightChild);}x->s = x->RightChild->s + 1;}
}

Insert插入函数:

template<class T>
MaxHBLT<T>& MaxHBLT<T>::Insert(const T & x)
{// 把 x 插入到左高树中HBLTNode<T> *q = new HBLTNode<T>(x, 1);Meld(root, q);return *this;
}

DeleteMax函数:

template<class T>
MaxHBLT<T>& MaxHBLT<T>::DeleteMax(T & x)
{if (!root){throw OutOfBounds();}//树不为空x = root->data;HBLTNode<T> *L = root->LeftChild;HBLTNode<T> *R = root->RightChild;delete root;root = L;Meld(root, R);return *this;
}

Initialize初始化数组函数:

如数组: 7 , 1 , 9 , 11 , 2 数据,这个a b c d 就是对应顺序的合并的方式。

template<class T>
void MaxHBLT<T>::Initialize(T a[], int n)
{// 初始化有n个元素的 H B LT 树Queue<HBLTNode<T>* >  Q(n);Free(root);for (int i =1; i<=n; i++){//创建只有一个节点的树HBLTNode<T>* q = new HBLTNode<T>(a[i],1);Q.Add(q);}//不断合并队列中的树HBLTNode<T> *b, *c;for ( int i = 1; i<= n-1;i++){Q.Delete(b);Q.Delete(c);Meld(b, c);//把合并的放入队列Q.Add(b);}if (n){Q.Delete(root); //把最后的左高树,给root}
}

逐层遍历输出函数 :

template<class T>
void MaxHBLT<T>::LevelOrder()
{Queue<HBLTNode<T>* > Q(20); //支持20个长度,后期想变可以这里改HBLTNode<T>* q;q = root;while (q){cout << q->data << " ";if (q->LeftChild){Q.Add(q->LeftChild);}if (q->RightChild){Q.Add(q->RightChild);}if (!Q.IsEmpty()){Q.Delete(q); //删除头元素,赋值给q}else{break;}}}

Free函数:

template<class T>
void MaxHBLT<T>::Free(HBLTNode<T>* t)
{delete t;t = 0;
}

测试函数:

void testMaxHBLT()
{int a[] = { 0,7,1,9,11,2 }; //为了方便,a[1]开始取数,所以第一个数是0cout << "原始数据数组是:" << endl;for (int i =1; i<=5; i++){cout << a[i] << " ";}cout << endl;cout << "排成二叉树结果(层次输出)" << endl;MaxHBLT<int> MH;MH.Initialize(a, 5);MH.LevelOrder();
}

测试结果:

结果正确,喜欢的朋友可以一关注我博客,一起来学习一下,需要源码的请私信我。

(1小时数据结构)数据结构c++描述(十九) --- 最大左高树相关推荐

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

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

  2. 29、数据结构笔记之二十九数组之硬币抛掷模拟

    29.数据结构笔记之二十九数组之硬币抛掷模拟 "人生是各种不同的变故.循环不已的痛苦和欢乐组成的.那种永远不变的蓝天只存在于心灵中间,向现实的人生去要求未免是奢望.-- 巴尔扎克" ...

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

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

  4. 数据结构与算法之左高树

    知识点来源于参考书籍<数据结构.算法与应用>,本人仅作整理与记录,方便日后复习查看. 左高树的定义: 设x是扩充二叉树的一个结点,并令left_child(x)和right_child(x ...

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

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

  6. 《数据结构与算法》(十九)- 多路查找树

    目录 前言 1. 多路查找树(B树) 1) 2-3树 1.1) 2-3树的插入实现 1.2) 2-3树的删除实现 2) 2-3-4树 3) B树 4) B+树 2. 总结 原文地址:https://p ...

  7. 数据结构笔记(二十九)--最小生成树(prim算法思想)

    最小生成树(prim算法思想) 一.预知概念 直达:两顶点直接相连接 路径:两顶点之间可以有其他顶点,但最终两顶点是能够连接的 假如我们有四台电脑,怎样连接才能保证这四台电脑两两相互通信组成局域网呢? ...

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

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

  9. 数据结构(十九) -- C语言版 -- 树 - 树、森林、二叉树的江湖爱恨情仇、相互转换

    内容预览 零.读前说明 一.树转换为二叉树 二.二叉树转换为树 三.二叉树转换为森林 四.森林转换为二叉树 五.树与森林的遍历 5.1.树的遍历 5.2.森林的遍历 零.读前说明 本文中所有设计的代码 ...

最新文章

  1. 【已解决】烂泥:耳机有声音,话筒却没有输入……
  2. hoj 1067 Rails //poj1363 Rails 栈的简单应用
  3. BILIBILI 高并发实时弹幕系统的实战之路 | 架构师实践日
  4. MindSpore感恩节重磅福利,华为Mate 40E送送送!
  5. VTK:结构化网格之SGrid
  6. 投屏时,客厅电视与客厅电视DMR的区别
  7. springboot之数据校验及多环境切换
  8. Asp.net WebForm使用codeFirst建立和修改数据库小结
  9. 测试显卡专业性能软件,如何测试显卡的性能?几款的显卡性能检测软件推荐
  10. wps怎么免费导出简历_简历怎么写 简历模板word免费下载
  11. sp导出法线_sp导出贴图步骤_sp导出贴图
  12. 联想服务器bios中文显示,联想bios怎么设置中文显示
  13. 子、辰、卯、酉、午、辰时是几点到几点钟「知识普及」
  14. Êtes-vous au courant des derniers sacs lancel styles et tendances ?
  15. 机器学习算法工程师到底应该学哪个编程语言?
  16. 利用css制作3D照片墙
  17. PyCharm恢复初始设置
  18. 腾讯大讲堂之精益设计
  19. Mysql语句:查询
  20. 2021年Vue 学习目录

热门文章

  1. ISO认证证书上常见的认可标志
  2. C语言实现,输出特殊图案,请在c环境中运行,看一看,Very Beautiful!
  3. 关于JS的编码转换问题
  4. win10蓝牙无法连接,可以尝试在此Windows设备上打开蓝牙
  5. 为什么中国只有5%的景区暴利惊人?95%的景区却总是踩到陷阱!做文旅必须看懂此文!
  6. 支付业务名词及释义大全
  7. 北京大额股票配资 北京股票金融配资
  8. 安全计算:AntiVir Personal Edition提供免费病毒防护
  9. 二进制枚举子集(总结+应用)
  10. 视频号容易被限流的8个雷区,这些规则你一定要知道!