(1小时数据结构)数据结构c++描述(十九) --- 最大左高树
定义
[最大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++描述(十九) --- 最大左高树相关推荐
- 数据结构(十六)——左高树(含合并过程详细图解)
文章目录 前言 左高树 什么是左高树? 为什么要使用左高树? 最大左高树实现及复杂度分析 节点类和最大左高树类 合并方法 插入(push).删除(pop) 初始化 左高树合并图解 前言 看到左高树的时 ...
- 29、数据结构笔记之二十九数组之硬币抛掷模拟
29.数据结构笔记之二十九数组之硬币抛掷模拟 "人生是各种不同的变故.循环不已的痛苦和欢乐组成的.那种永远不变的蓝天只存在于心灵中间,向现实的人生去要求未免是奢望.-- 巴尔扎克" ...
- 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 优先级队列 — 左高树
<数据结构.算法与应用 -- C++语言描述>学习笔记 - 优先级队列 - 左高树 一.左高树 1.外部节点 2.高度优先左高树 (1)定义 (2)特性 (3)HBLT 与 大小根树 3. ...
- 数据结构与算法之左高树
知识点来源于参考书籍<数据结构.算法与应用>,本人仅作整理与记录,方便日后复习查看. 左高树的定义: 设x是扩充二叉树的一个结点,并令left_child(x)和right_child(x ...
- C++(数据结构与算法):42---优先级队列的实现(扩充二叉树、高度优先左高树(HBLT)、重量优先左高树(WBLT))
本文代码下载: 方式1:公众号[多栖技术控小董]回复[3586]免费获取下载链接 方式2:CSDN下载链接:https://download.csdn.net/download/qq_41453285 ...
- 《数据结构与算法》(十九)- 多路查找树
目录 前言 1. 多路查找树(B树) 1) 2-3树 1.1) 2-3树的插入实现 1.2) 2-3树的删除实现 2) 2-3-4树 3) B树 4) B+树 2. 总结 原文地址:https://p ...
- 数据结构笔记(二十九)--最小生成树(prim算法思想)
最小生成树(prim算法思想) 一.预知概念 直达:两顶点直接相连接 路径:两顶点之间可以有其他顶点,但最终两顶点是能够连接的 假如我们有四台电脑,怎样连接才能保证这四台电脑两两相互通信组成局域网呢? ...
- 数据结构——左高树(C语言)
介绍左高树之前,先简单介绍下扩充二叉树的概念.扩充二叉树一棵二叉树,其所有空的子树都由方形结点代替.方形结点称为外部结点,原来的结点称为内部结点. 设x是扩充二叉树的一个结点,并令left_child ...
- 数据结构(十九) -- C语言版 -- 树 - 树、森林、二叉树的江湖爱恨情仇、相互转换
内容预览 零.读前说明 一.树转换为二叉树 二.二叉树转换为树 三.二叉树转换为森林 四.森林转换为二叉树 五.树与森林的遍历 5.1.树的遍历 5.2.森林的遍历 零.读前说明 本文中所有设计的代码 ...
最新文章
- 【已解决】烂泥:耳机有声音,话筒却没有输入……
- hoj 1067 Rails //poj1363 Rails 栈的简单应用
- BILIBILI 高并发实时弹幕系统的实战之路 | 架构师实践日
- MindSpore感恩节重磅福利,华为Mate 40E送送送!
- VTK:结构化网格之SGrid
- 投屏时,客厅电视与客厅电视DMR的区别
- springboot之数据校验及多环境切换
- Asp.net WebForm使用codeFirst建立和修改数据库小结
- 测试显卡专业性能软件,如何测试显卡的性能?几款的显卡性能检测软件推荐
- wps怎么免费导出简历_简历怎么写 简历模板word免费下载
- sp导出法线_sp导出贴图步骤_sp导出贴图
- 联想服务器bios中文显示,联想bios怎么设置中文显示
- 子、辰、卯、酉、午、辰时是几点到几点钟「知识普及」
- Êtes-vous au courant des derniers sacs lancel styles et tendances ?
- 机器学习算法工程师到底应该学哪个编程语言?
- 利用css制作3D照片墙
- PyCharm恢复初始设置
- 腾讯大讲堂之精益设计
- Mysql语句:查询
- 2021年Vue 学习目录