平衡二叉树源码

C#实现二叉树与平衡二叉树完整源码项目 二叉树听起来很简单:每个节点最多有两个子节点,分别叫左孩子和右孩子。但它的意义远不止于此。它是一种天然支持递归定义的结构:一棵二叉树要么为空,要么由一个根节点加上两棵互不相交的左右子树构成。这个递归特性让很多算法变得异常优雅。比如遍历整棵树,只需要三行代码就能搞定逻辑框架:// 前序:处理当前 → 左 → 右// 中序:左 → 处理当前 → 右// 后序:左 → 右 → 处理当前// 具体怎么处理,取决于你的需求是不是有种“大事化小”的智慧? 阅读详情

转载:http://www.yuanma.org/data/2006/0917/article_1551.htm

#include <stdio.h>

typedef struct bitreetype

 {

  int item;

  int bdegree;/*平衡因子,左子树深度-右子树深度*/

  struct bitreetype *lchild;

  struct bitreetype *rchild;

 }bitree;

typedef struct treequeuetype

 {

  int head;

  int tail;

  bitree *items[1000];

 }treequeue;/*定义一个队列,后面的平衡调整要用层序遍历,于是要用这个队列*/

void resetqueue(treequeue *queue)

 {

  queue->head=-1;

  queue->tail=-1;

  return;

 }/*把队列清空*/

void inqueue(treequeue *queue,bitree *element)

 {

  queue->tail++;

  queue->items[queue->tail]=element;

 }/*入队列*/

bitree *outqueue(treequeue *queue)

 {

  queue->head++;

  return queue->items[queue->head];

 }/*出队列*/

int isqueueempty(treequeue *queue)

 {

  if(queue->head==queue->tail)

  return 1;

  else

  return 0;

 }/*判断队列是否为空*/

void fillmemory(char *source,int len,char content)

 {

  while(len)

  {

   source=source+len;

   *source=content;

   source=source-len;

   len--;

  }

  *source=0;

 }/*用CONTENT的内容去FILL以SOURCE为首,LEN长度的一块空间,初始化内存方便*/

int getnums(int *dst)/*输入字符串并把字符串转化为一串数存入DST指向的内存中去,我们用它采集原始数据*/

 {

  char *temp,*num,*p,t;

  int len=0;

  temp=(char *)malloc(1000*sizeof(char));

  num=(char *)malloc(20*sizeof(char));

  p=num;

  fillmemory(temp,1000,0);

  fillmemory(num,20,0);

  scanf("%s",temp);

  t=*temp;

  temp++;

  while(t)

  {

   if(t!=',')

   {

    *num=t;

    num++;

    t=*temp;

    temp++;

   }/*抽出一个数放入NUM临时空间中*/

   else

   {

    num=p;

    *dst=atoi(num);

    len++;

    fillmemory(num,20,0);

    dst++;

    t=*temp;

    temp++;

   }/*将NUM中的数字转化出来存入DST中*/

  }

  num=p;

  *dst=atoi(num);

  len++;

  fillmemory(num,20,0);

  dst++;

  t=*temp;

  temp++;

  return len;

 }/*处理最后一个数字*/

/*****唉,写上面的函数时都两个月没写过C了,所以可能上面的函数条理相当差的说*****/

void insertbitree(bitree *head,int source)/*向以HEAD为头结点的排序二叉树中插入一个以SOURCE为内容的点*/

 {

  if(source<=head->item)

  {

   if(head->lchild==NULL)

   {

    head->lchild=(bitree *)malloc(sizeof(bitree));

    head->lchild->item=source;

    head->lchild->lchild=NULL;

    head->lchild->rchild=NULL;

    head->lchild->bdegree=0;

   }

   else

   insertbitree(head->lchild,source);

  }

  else

  {

   if(head->rchild==NULL)

   {

    head->rchild=(bitree *)malloc(sizeof(bitree));

    head->rchild->item=source;

    head->rchild->lchild=NULL;

    head->rchild->rchild=NULL;

    head->rchild->bdegree=0;

   }

   else

   insertbitree(head->rchild,source);

  }

 }/*递归插入的思想:如果SOURCE小于头结点,那么插入头结点的左孩子,否则插入右孩子,递归向下,直到找到空位置为止*/

bitree *createbitree(int *source,int len)/*用SOURCE为首地址,LEN为长度的一段空间中的内容建立一棵二叉数*/

 {

  int temp;

  bitree *head=NULL;

  head=(bitree *)malloc(sizeof(bitree));

  head->lchild=NULL;

  head->rchild=NULL;

  head->item=*source;

  head->bdegree=0;

  source++;

  len--;

  while(len>0)

  {

   insertbitree(head,*source);/*这个函数很强大,用心体会吧,哈哈哈*/

    source++;

    len--;

  }

  return head;

 }

int getdepth(bitree *head)/*求排序二叉树的深度*/

 {

  int ltemp,rtemp;

  if(head==NULL)return 0;

  if(head->lchild==NULL && head->rchild==NULL)return 1;

  ltemp=1+getdepth(head->lchild);

  rtemp=1+getdepth(head->rchild);

  if(ltemp>=rtemp)return ltemp;

  else return rtemp;

 }/*递归求深的思想:首先规定好0,1两个递归出口,然后分别求左右子树的深度并返回大者*/

void addbdegree(bitree *head)/*为排序二叉树追加平衡因子*/

 {

  if(head==NULL)return;

  else

  {

   head->bdegree=getdepth(head->lchild)-getdepth(head->rchild);

   addbdegree(head->lchild);

   addbdegree(head->rchild);

  }

 }

bitree *leveldetect(bitree *head)/*以层序遍历为基本框架,检查"特殊"点*/

 {

  treequeue *tqueue;

  bitree *temp;

  tqueue=(treequeue *)malloc(sizeof(treequeue));

  resetqueue(tqueue);

  if(head!=NULL)inqueue(tqueue,head);

  while(!isqueueempty(tqueue))

  {

   temp=outqueue(tqueue);

   if(temp->bdegree<=-2 || temp->bdegree>=2)

   {

    if(temp->bdegree==2 && temp->lchild!=NULL && temp->lchild->bdegree==1)

     return temp;

    if(temp->bdegree==2 && temp->lchild!=NULL && temp->lchild->bdegree==-1)

    return temp;

    if(temp->bdegree==-2 && temp->rchild!=NULL && temp->rchild->bdegree==-1)

    return temp; 

    if(temp->bdegree==-2 && temp->rchild!=NULL && temp->rchild->bdegree==1)

    return temp;

   }

   if(temp->lchild!=NULL)inqueue(tqueue,temp->lchild);

   if(temp->rchild!=NULL)inqueue(tqueue,temp->rchild);

  }

  return NULL;

 }/*(2,1),(2,-1),(-2,-1),(-2,1)完美的卡诺图啊!!*/

bitree *getmother(bitree *head,bitree *child)

 {

  bitree *temp;

  if(head==child)return NULL;

  if(head->lchild==child || head->rchild==child)return head;

  if(head->lchild==NULL || head->rchild==NULL)return NULL;

  if(head->lchild!=NULL)

  {

   temp=getmother(head->lchild,child);

   if(temp!=NULL)return temp;

  }

  return getmother(head->rchild,child);

 }/*递归查找一个节点的妈妈*/

bitree *createsuperbitree(int *source,int len)/*不消说了,建立平衡二叉树*/

 {

  int itemp;

  bitree *head=NULL;

  bitree *temp=NULL;

  bitree *tmother=NULL;

  bitree *p=NULL;

  bitree *q=NULL;

  head=(bitree *)malloc(sizeof(bitree));

  head->lchild=NULL;

  head->rchild=NULL;

  head->item=*source;

  head->bdegree=0;

  source++;

  len--;

  while(len>0)

  {

   insertbitree(head,*source);

   addbdegree(head);

   temp=leveldetect(head);

   if(temp!=NULL)

   {

    tmother=getmother(head,temp);

    if(temp->bdegree==2 && temp->lchild!=NULL && temp->lchild->bdegree==1)

    {

     p=temp->lchild;

     temp->lchild=p->rchild;

     p->rchild=temp;

     if(tmother!=NULL)

           {

     if(tmother->lchild==temp)tmother->lchild=p;

     else tmother->rchild=p;

           }

     else

     head=p;

    }/*LL*/

    if(temp->bdegree==2 && temp->lchild!=NULL && temp->lchild->bdegree==-1)

    {

     p=temp->lchild->rchild;

     q=temp->lchild;

     q->rchild=p->lchild;

     temp->lchild=p->rchild;

     p->lchild=q;

     p->rchild=temp;

     if(tmother!=NULL)

     {

      if(tmother->lchild==temp)tmother->lchild=p;

      else tmother->rchild=p;

     }

     else

     head=p;

    }/*LR*/

    if(temp->bdegree==-2 && temp->rchild!=NULL && temp->rchild->bdegree==-1)

    {

     p=temp->rchild;

     temp->rchild=p->lchild;

     p->lchild=temp;

     if(tmother!=NULL)

     {

      if(tmother->lchild==temp)tmother->lchild=p;

      else tmother->rchild=p;

     }

     else

     head=p;

    }/*RR*/

    if(temp->bdegree==-2 && temp->rchild!=NULL && temp->rchild->bdegree==1)

    {

     p=temp->rchild->lchild;

     q=temp->rchild;

     temp->rchild=p->lchild;

     q->lchild=p->rchild;

     p->lchild=temp;

     p->rchild=q;

     if(tmother!=NULL)

     {

      if(tmother->lchild==temp)tmother->lchild=p;

      else tmother->rchild=p;

     }

     else

     head=p;

    }/*RL*/

    addbdegree(head);

   }

   source++;

    len--;

  }

  return head;

 }

main()/*演示*/

 {

  int binums[100],i,len;

  bitree *head,*temp;

  for(i=0;i<=99;i++)binums[i]=0;

  len=getnums(binums);

  head=createsuperbitree(binums,len);

  temp=getmother(head,head->rchild->rchild->rchild);

 } 

 

C语言|深入浅出讲解int转换为float全过程(附2017年统考大题案例) int转换为float类型为什么会发生精度损失? 精度损失的详细过程究竟是什么样的? 什么样情况float会发生精度损失?没有弄懂2017年浮点数统考大题? 这一篇用2017年统考大题案例帮你更深的理解浮点数的存储规则。 阅读详情

相关推荐

ABAP BAPI_PRODORD_CHANGE函数详解:如何高效重读生产订单主数据

本文深入解析ABAP BAPI_PRODORD_CHANGE函数在生产订单主数据高效处理中的应用。通过详细讲解函数架构、主数据重读机制及实战代码示例,帮助开发人员掌握生产订单数据的精准读取与更新技术,提升SAP系统集成与自动化处理效率。

weixin_29207149的博客 467

关于C++类库KYLib: 用C语言实现平衡二叉树(AVL tree)的源码

平衡二叉树(AVL tree)调整算法请参见我的博文: 若要在 C++ 中使用则只要将 KYAVLTreeC.c 改为 KYAVLTreeC.cpp 即可。   用C语言实现平衡二叉树(AVL tree)头文件如下: // ======================================= // Unit : AVL tree (KYAVLTreeC.h) //

Kyee编程之道 2165

自旋玻璃(spin glass)、自旋冰(spin ice)和量子自旋液体(quantum spin liquid)(之二)

具有相同电荷的电子相互排斥。结果,为了在极其拥挤的环境中相互超越,他们不得不改变自己的行为。剑桥大学和英国伯明翰大学于 2009 年 7 月发表的研究表明,电子可以通过量子隧穿从金属表面跳到相近位置的量子线上,这样做后,将分离成两个准粒子,命名为的自旋子和全子。Van den Brink、Khomskii 和 Sawatzky 在 1997-1998 年对轨道子进行了理论上的预测。在 2011 年 9 月发给出版商的论文中报告了它作为一个单独的准粒子的实验观察结果。

qq_32515081的博客 1万+

Java集合系列源码分析(七)-- 平衡二叉树

一、平衡二叉树 平衡二叉树(Balanced Binary Tree)是为了防止树的高度增长过快,出现类似于上一节最后举出的那种特殊情况,降低了二叉排序树的性能。 于是人们规定,保证任意节点的左、右子树高度差的绝对值不超过1,这样的二叉树成为平衡二叉树。 二、平衡二叉树的方法 首先,平衡二叉树操作中始终需要保持平衡,因此必须要准守平衡原则,平衡二叉树的平衡原则是:每次需要调整的都是最小不平衡二叉...

Double____C的博客 361

Proteus仿真实战:基于IIC驱动SSD1306的0.96英寸OLED显示方案解析

本文详细解析了在Proteus仿真环境中基于IIC驱动SSD1306的0.96英寸OLED显示方案。从硬件搭建、IIC接口连接、软件驱动移植到常见问题排查,提供了全面的实战指导,帮助开发者快速实现OLED显示功能并优化性能。

weixin_28724661的博客 770

光伏储能交直流微电网Matlab/Simulink仿真模型

首先是光伏储能交直流微电网,这个也是我还是之前在硕士期间在做光伏扶贫项目时候搭建的仿真,仿真由光伏、蓄电池及负载组成的独立直流微电网,提出电压和电流分段式协同控制策略。接下来我将主要更新关于光伏、风电、储能微电网系统相关的内容,包括具体建模和控制。

2401_89292556的博客 785

平衡二叉树,插入,删除,C源码

转载请注明出处玮璘博客:http://www.wangweilin.name/rj_454.html 概念就是模型,写写吧:平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。   就以下三遍文章足以。。   一篇可以让你知道如果写自己平衡二

qq160816的专栏 784

潜在图神经网络学习笔记(Latent Graph Neural Networks for Human Skeleton-based Action Recognition)

在本文中,我们从一个新的角度来解决这个问题,通过将非结构化的骨架数据映射到潜在空间,如图2所示,这里称为潜在特征空间或嵌入空间,其中一组项嵌入在一个流形中[ 1 ],并且在潜在空间中彼此更相似的项被放置在彼此更接近的位置。潜在空间中的位置可以被认为是由一组潜在变量定义的,这些潜在变量来源于对象的相似性。将骨架数据嵌入到流形中,消除了远近邻居之间的冗余依赖关系,以解决加权问题。得到具有多尺度聚合特征的稀疏图矩阵结构,以更好地理解骨骼关节的直接加权信息。

qq_45631885的博客 489

github源码指引:共享内存、数据结构与算法:平衡二叉树set

github源码指引:共享内存、数据结构与算法:平衡二叉树set

编程之道在明明德在亲民在止于至善 757

电源芯片TPS54560典型应用电路及设计详解

TPS54560 是一款配有集成型高侧 MOSFET 的 60V、5A DC-DC转换器,输入电压范围7-60V,输出电压可通过外部反馈电阻设置成略低于输入电压的任意值。**所以,**R5=31.25KΩ、R6:10KΩ(常用值)时,即可设置输出电压为 3.3V。**所以,**R5=140KΩ、R6:10KΩ(常用值)时,即可设置输出电压为12V。设计 TPS54560 的输出电压时,主要通过外部反馈电阻网络来设置输出电压。因此,输出 3.3V ,输入电压24V时推荐的电感值为 8µH 至 10µH。

weixin_42306872的博客 1万+

使用AI预测彩票的架构思路

彩票是随机的数字游戏,不要过度依赖AI,本文仅供娱乐研究

淘淘小窝 9407

平衡二叉树(附自己写的源码)

如果不平衡 用旋转(不平衡变平衡) 设置高度。就好像担当子,要左右平衡才好担,二叉树同样如此,要左右平滑才好查找。第三种:(左右旋)先以当前节点(10)左旋,然后以当前节点的父节点(11)为轴右旋。第四种:(右左旋)先以当前节点(10)左旋,然后以当前节点的父节点(11)为轴右旋。树中每一个节点左右孩子的高度差不超过1的有序二叉树(左右孩子的高度差)看如图:我们要查找最下方的1,左边和右边各要查找的次数是多少?(查找数据的高度)如:根为1,根孩子:2,根孩子的孩子:3。为什么学习平衡二叉树?

多方通行8的博客 290

YOLO11实战优化:暗光环境检测 | 引入Retinex增强模块与YOLO11联合训练,解决夜间/低照度场景抓拍痛点

本文探讨了暗光环境下目标检测的技术挑战与解决方案。研究发现,传统CNN模型在低照度条件下性能显著下降,主要由于光子数减少导致信噪比降低、目标特征被噪声淹没。针对这一问题,文章提出将可微分光照增强模块嵌入YOLO检测器的技术路线,重点分析了Retinexformer+YOLO11联合方案的优势。 文章对比了YOLO系列模型在暗光场景的表现,指出YOLO11凭借其C3k2模块、无锚检测头和多任务统一骨干网络,在低对比度图像特征提取方面优于前代产品。同时详细介绍了Retinexformer的理论基础和技术创新,包

2601_95807009的博客 206

平衡二叉树(附Java实现源码)

右旋转 平衡二叉树的添加 步骤 如果要添加的结点为空直接退出方法 判断传入的结点的值与当前子树的根结点的关系 要添加的结点的值小于当前结点的值 若当前结点的左子结点为空,则将该结点设置为当前结点的左子结点 若当前结点的左子结点不为空,递归向左子树添加 要添加的结点的值大于当前结点 若当前结点的右子结点为空,则将该结点设置为当前结点的右子结点 若当前结点的右子结点不为空,递归向右子树添加 添加完成后,在每一层子树都进行判断 如果右子树的高度-左子树的高度 > 1 则进行左旋转 如果当前结

Ekertree的博客 751

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

stl源码剖析08——平衡二叉树

一、二叉搜索树 所谓二叉搜索树,可提供对数时间的元素插入和访问 节点放置规则:任何节点的键值一定大于其左子树的每一个节点的键值;并小于其右子树中的每一个节点的键值 最大值、最小值: 最小值:从根节点出发,一直往左走,直至无左路可走,即得到最小元素 最大值:从根节点出发,一直往右走,直至无右路可走,即得到最大元素 二叉搜索树的查找 从根节点出发,根据值的大小,逐个向左或向右查找,就可以查找到元素 二叉搜索树的插入 插入新元素时,从根节点开始,遇键值较大者就向左,遇键值较小者就向右,一

www_dong的博客 311

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# 平衡二叉树 SBT 源码

嗯今天写一个软件的时候不知不觉用到了BST,嗯,BST么,虽然实现很麻烦但是好在.NET已经实现了,直接调用呗…… 可等我调用的时候才发现…… MS根本没有给你开放接口……用反编译一看,其实.NET早就把红黑树实现了,就是SortedSet只是因为MS懒得给你写帮助文档(这不是我说的,是Jeffrey在CLRVIA C#里说的……)于是么…… 你就只能默默地用反编译去提取了…… 只是…… 反正

songyux6的专栏 769

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

平衡二叉树判定方法(c++)实现

-- 欢迎指正-- 平衡二叉树特点:   任意一个结点的平衡因子(左子树高度 - 右子树高度)的绝对值不会超过1。   下面的方法,若是平衡二叉树,则还会返回树的高度 结点结构: struct node { int data; int height; node *lc; node *rc; node() ...

weixin_30888707的博客 99

平衡二叉树 AVL树结构详解 [Java实现]--源码部分

作者NeroJings来源https://blog.youkuaiyun.com/zhang6622056/article/details/82698859正文部分见:平衡二叉树 A...

纯洁的微笑 911

平衡二叉树总结

目录 平衡二叉树相关概念以及性质 平衡二叉树的类结构 LL型失衡以及解决办法 RR型失衡以及解决办法 LR型失衡以及解决办法 RL型失衡以及解决办法 balance和checkBalance函数 完整源码测试 说明 在学二叉平衡树之前,可以先学一下二叉排序树。 在下面的源代码中,设计的二叉查找树的insert方法和remove方法,以及findMin()和findMa...

zxzxin的博客~ 4029

平衡二叉树算法实现课设(附:源码与文档)

平衡二叉树算法实现课设

qq_52683382的博客 1371

Java源码集合类TreeMap学习1——数据结构4平衡二叉树的旋转

平衡二叉树的旋转 理解清楚平衡二叉树的概念。具体如何旋转是平衡二叉树保持继续平衡的,可以参考如下的两个博客和一本书。 https://www.tutorialspoint.com/data_structures_algorithms/avl_tree_algorithm.htm http://btechsmartclass.com/DS/U5_T2.html 《数据结构C++》作者

Fish的专栏 500

平衡二叉树(c++)实现(存在问题:插入节点后,问题:调整树的结构存在问题)...

!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist 更新那时间: 22:13 03-02-2020 逻辑存在问题:插入节点后,调整数的结构不正确。 待修复 ------ 欢迎指正------- 1、参考资料:   书籍:《算法导论》   博文:http://www.cnblogs.com/fivestudy/fivestudy/p/10...

知其所以然 107

LeetCode 面试题55 - II. 平衡二叉树

我的LeetCode:https://leetcode-cn.com/u/ituring/ 我的LeetCode刷题源码[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 面试题55 - II. 平衡二叉树 与以下题目相同 前往:LeetCode 110. 平衡二叉树 ...

iTuring_Zhou的专栏 92

平衡二叉树的旋转_基于Java8的红黑二叉树之红黑颜色的源码分析,看不懂别怪我,看懂了你就彻底明白了...

前言第一次发知乎,很忐忑求轻喷,如果标题太猖狂,那你也不能骂我,大家将就下祖国的花朵;本文基于读者已经明白了二叉树,也明白什么是平衡二叉树,对红黑有疑问的朋友进行解惑;红黑对于我是一个困扰多年的问题,几年前我带别人看源码,看插入移除元素,始终没有去看红黑颜色的更改,同时也感觉红黑颜色不仅仅时象征,肯定有某种深意;注意,仅对红黑颜色做主要解释,因为笔者有这个疑惑在网上没找到想要的答案,所以自己花时间...

weixin_39716703的博客 191

Java集合源码分析(五):平衡二叉树(AVL Tree)

在上一章的文章中,我们讲到了二叉排序树,它很好的平衡了插入与查找的效率,但二叉排序树如果不平衡,那么查找效率就会大大降低,今天要讲的这个平衡二叉树就是一种解决这个问题的方法。 一、平衡二叉树的定义 平衡二叉树 是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1 。它是一种高度平衡的二叉排序树。意思是说,要么它是一棵空树,要么它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1 。我们将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF (Balance Fac

不会编程的派大星的博客 318
上一篇: C语言学生管理系统
下一篇: Linux使用技巧33则
K行天下
博客等级 码龄19年 358粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值