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

设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语言)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 可并堆(左高树、左偏树)

    可并堆(左高树.左偏树) 左偏树相对于二叉堆,其插入,弹出,合并的时间复杂度都是对数级别的. 高度优先左偏树(HBLT) 考虑一颗二叉树,将其叶子节点的子节点补全,那么原来有的节点叫做内部节点,新增加 ...

  8. 左式堆(左高树)实现

    左式堆是满足如下性质的二叉树(最小堆序): 要么为空树,要么根节点的左右子树均为左式堆,且根节点的关键码值小于等于左右子树所有节点的关键码值,此外左子树代表的左式堆的零路径长度大于等于右子树代表的左式 ...

  9. Java实现堆,最大堆,最小堆,左高树,左低树

    MyList.LinearList参见链接 MyTree.TreeNode参见链接 #Heap package MyHeap;public interface Heap {abstract publi ...

最新文章

  1. cnblogs和org2blog使用总结
  2. 在SpringBoot中使用Spring Session解决分布式会话共享问题
  3. struct2(四)编写Struct2 的Action
  4. esp32-cam的原理图
  5. linux centos yum 报错 [Errno 256] No more mirrors to try 解决方法
  6. 警告: deleting object of polymorphic class type which has non_virtual destructor
  7. 经典C语言程序100例之二二
  8. 教学一体机属于计算机的什么应用,教学一体机跟电脑有什么区别 让教学氛围有着更好的教学效果...
  9. 【电路补习笔记】1、电阻的参数与选型
  10. 第二节 DOM-Document对象
  11. 电脑老是提示虚拟内存不足的原因及解决办法
  12. SVG矢量绘图 path路径详解(基本画法)
  13. 计算机页面图形颠倒,电脑屏幕倒过来了如何解决
  14. VBA Mysql 类
  15. Python字符串isdecimal()
  16. Delphi LiveBinds组件
  17. 使用REST framework
  18. 【LeetCode】【字符串】题号:*38. 外观数列
  19. HTML——网页设计基础
  20. Kibana警报之索引连接器

热门文章

  1. 2012北京航空航天大学考研机试真题
  2. 转:值得收藏!那些鲜为人知的 Mac OS X 技巧
  3. 需求文档怎么写?这里有一套思维框架
  4. c语言tcp多线程聊天,基于tcp和多线程的多人聊天室-C语言
  5. 常见的网络安全风险有哪些?
  6. 基于AKA的IMS接入认证机制
  7. java 开发设计 小游戏 英雄 怪物 武器 关键代码
  8. php 指定大小缩略图片
  9. ¥符号在安卓上显示只有一个横杠的问题
  10. vue 避免全局样式污染的正确做法