数据结构——左高树(C语言)
介绍左高树之前,先简单介绍下扩充二叉树的概念。扩充二叉树一棵二叉树,其所有空的子树都由方形结点代替。方形结点称为外部结点,原来的结点称为内部结点。
设x是扩充二叉树的一个结点,并令left_child(x)和right_child(x)分别表示内部结点的左、右儿子。定义shortest(x)为从x到一个外部结点的最短路程长度。
左高树
定义
左高树是一棵二叉树,且如果该二叉树不空,则对其中的每个内部结点x,都有:
Shortest(left_child(x))>= Shortest(right_child(x))。
左高树的一个应用是合并操作,应用场景是:当某个优先队列的服务器关闭时,就需要将其与另一个正在运行服务器的优先队列合并.如果两个队列的元素总数为n,则一般的堆结构的复杂度为n,但是左高树可以达到log(n).插入和删除操作都可以通过合并操作来完成。
最小(最大)左高树是一棵左高树,其中的每个内部结点的关键字值不大于(不小于)该结点的儿子结点的关键字值。
以下讨论最小左高树的操作:
插入和删除最小元素操作都可以通过合并操作来完成。要把元素x插入到左高树A中,先建立一棵只有一个元素x的最小左高树B,再合并最小左高树A和B。要从一棵非空最小左高树A删除最小元素,则只需合并最小左高树A的左子树和右子树,再把最小左高树的根结点删除。
以下重点介绍最小左高树的合并操作。
假设要合并最小左高树A和B,首先,沿着A和B的最右路径,得到一棵包含A和B所有元素的二叉树(注意:这里只是得到二叉树,而不是最小左高树)。使得该二叉树具有以下性质:所有结点的关键字都不大于其儿子结点关键字。必要时交换结点的左、右子树,将其转化为最小左高树。
合并操作
步骤:
1、 假设合并最小左高树A和B,首先比较两棵树根结点的关键字值,以最小的关键字作为新二叉树的根结点。
2、 保留A的左子树不变,将其右子树与最小左高树B合并,合并后的二叉树成为新的A的右子树。
3、 把二叉树转换为最小左高树从最后一个修改结点(注意:这里不是最后结点)开始,回溯到最终的树根结点,使得路径上的所有结点满足不等式:shortest(left_child())>= shortest(right_child())
程序:
函数定义:
#ifndef LEFTIST_TREE_H_INCLUDED
#define LEFTIST_TREE_H_INCLUDED
#include <malloc.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 11
#define SWAP(x,y,t) ((t)=(x),(x)=(y),(y)=(t))typedef struct lefttree *LeftistTree;
typedef struct lefttree
{LeftistTree left_child;LeftistTree right_child;int data;int shortest;
}left_tree;
void min_uion(LeftistTree*a,LeftistTree*b);
void init_left_tree(LeftistTree *a,int data);
void min_combine(LeftistTree *a,LeftistTree *b);
void show_pre_tree( LeftistTree *a );
/*初始化二叉树*/
void init_left_tree(LeftistTree *b,int data)
{if(!*b){*b=(LeftistTree)malloc(sizeof(left_tree));(*b)->data=data;(*b)->left_child=NULL;(*b)->right_child=NULL;(*b)->shortest=1;}
}
/*合并两棵树*/
void min_combine(LeftistTree *a,LeftistTree *b)
{if(!*a)*a=*b;else if(*b)min_uion(a,b);*b=NULL;
}
/*合并两棵最小左高树*/
void min_uion(LeftistTree*a,LeftistTree*b)
{LeftistTree temp=NULL;if((*a)->data>(*b)->data)//比较两棵树根结点大小SWAP(*a,*b,temp);if(!(*a)->right_child)//右子树是否为空(*a)->right_child=*b;elsemin_uion(&(*a)->right_child,b);//把a右子树和b合并if(!(*a)->left_child){(*a)->left_child=(*a)->right_child;(*a)->right_child=NULL;}else if((*a)->right_child->shortest>(*a)->left_child->shortest)SWAP((*a)->right_child,(*a)->left_child,temp);if(!(*a)->right_child)(*a)->shortest=1;else(*a)->shortest=(*a)->right_child->shortest+1;
}
/*先序递归遍历最小左高树*/
void show_pre_tree(LeftistTree *a)
{if (*a){printf("%d ", (*a)->data );show_pre_tree( &(*a)->left_child );show_pre_tree( &(*a)->right_child );}
}
#endif // LEFTIST_TREE_H_INCLUDED
程序测试:
#include "leftist_tree.h"int main()
{LeftistTree a=NULL;LeftistTree b=NULL;int i,data;for(i=1;i<MAX_SIZE-5;i++){scanf("%d",&data);init_left_tree(&b,data);min_combine(&a,&b);}show_pre_tree(&a);return 0;
}
数据结构——左高树(C语言)相关推荐
- 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 优先级队列 — 左高树
<数据结构.算法与应用 -- C++语言描述>学习笔记 - 优先级队列 - 左高树 一.左高树 1.外部节点 2.高度优先左高树 (1)定义 (2)特性 (3)HBLT 与 大小根树 3. ...
- 数据结构(十六)——左高树(含合并过程详细图解)
文章目录 前言 左高树 什么是左高树? 为什么要使用左高树? 最大左高树实现及复杂度分析 节点类和最大左高树类 合并方法 插入(push).删除(pop) 初始化 左高树合并图解 前言 看到左高树的时 ...
- 数据结构与算法之左高树
知识点来源于参考书籍<数据结构.算法与应用>,本人仅作整理与记录,方便日后复习查看. 左高树的定义: 设x是扩充二叉树的一个结点,并令left_child(x)和right_child(x ...
- (1小时数据结构)数据结构c++描述(十九) --- 最大左高树
定义 [最大H B LT ] 即同时又是最大树的HBLT: [最小HBLT ] 即同时又是最小树的HBLT. 有关最大树的定义在上一章节有解析:传送门 堆树的定义 最大左高树合并:(重要知识点) 上图 ...
- 高度优先左高树(HBLT) - C语言
相关概念: 左高树(leftist tree)将树中的节点分为两类: 外部节点:用于代替树中的空子树:其余节点均叫做内部节点.内部节点就是我们所能看到的树中的每个真实节点,如果某个节点的左子树为空,那 ...
- C++(数据结构与算法):42---优先级队列的实现(扩充二叉树、高度优先左高树(HBLT)、重量优先左高树(WBLT))
本文代码下载: 方式1:公众号[多栖技术控小董]回复[3586]免费获取下载链接 方式2:CSDN下载链接:https://download.csdn.net/download/qq_41453285 ...
- 可并堆(左高树、左偏树)
可并堆(左高树.左偏树) 左偏树相对于二叉堆,其插入,弹出,合并的时间复杂度都是对数级别的. 高度优先左偏树(HBLT) 考虑一颗二叉树,将其叶子节点的子节点补全,那么原来有的节点叫做内部节点,新增加 ...
- 左式堆(左高树)实现
左式堆是满足如下性质的二叉树(最小堆序): 要么为空树,要么根节点的左右子树均为左式堆,且根节点的关键码值小于等于左右子树所有节点的关键码值,此外左子树代表的左式堆的零路径长度大于等于右子树代表的左式 ...
- Java实现堆,最大堆,最小堆,左高树,左低树
MyList.LinearList参见链接 MyTree.TreeNode参见链接 #Heap package MyHeap;public interface Heap {abstract publi ...
最新文章
- cnblogs和org2blog使用总结
- 在SpringBoot中使用Spring Session解决分布式会话共享问题
- struct2(四)编写Struct2 的Action
- esp32-cam的原理图
- linux centos yum 报错 [Errno 256] No more mirrors to try 解决方法
- 警告: deleting object of polymorphic class type which has non_virtual destructor
- 经典C语言程序100例之二二
- 教学一体机属于计算机的什么应用,教学一体机跟电脑有什么区别 让教学氛围有着更好的教学效果...
- 【电路补习笔记】1、电阻的参数与选型
- 第二节 DOM-Document对象
- 电脑老是提示虚拟内存不足的原因及解决办法
- SVG矢量绘图 path路径详解(基本画法)
- 计算机页面图形颠倒,电脑屏幕倒过来了如何解决
- VBA Mysql 类
- Python字符串isdecimal()
- Delphi LiveBinds组件
- 使用REST framework
- 【LeetCode】【字符串】题号:*38. 外观数列
- HTML——网页设计基础
- Kibana警报之索引连接器