定义结构体

struct Person
{//父节点struct Person* parent;//左子节点struct Person* lchild;//右子节点struct Person* rchild;int m;
};struct ABLtree
{//保存根节点信息struct Person* root;
};

初始化根节点

struct ABLtree* init_tree()
{//在堆区开辟一个ABLtree大小的空间struct ABLtree* tree = malloc(sizeof(struct ABLtree));//开辟失败返回NULLif (!tree){return NULL;}//初始化根节点为NULL并返回tree->root = NULL;return tree;
}

添加节点

//比较函数,返回两者的差值
int compare(struct Person* p1, struct Person* p2)
{return ((p1->m) - (p2->m));
}
//添加节点函数,内部调用
void insertPerson(struct Person* tree, struct Person* data, int(*compare)(struct Person*, struct Person*))
{//如果当前节点大于插入的节点if (compare(tree, data) > 0){//if当前节点的左节点为空if (NULL==tree->lchild){//把数据赋值给节点的左子节点tree->lchild = data;//把当前节点赋值给数据的父节点data->parent = tree;//返回return;}//不为空,则把数据的左子节点传入函数insertPerson(tree->lchild, data, compare);}else {//if当前节点的右节点为空if (NULL==tree->rchild){//把数据赋值给节点的右子节点tree->rchild = data;//把当前节点赋值给数据的父节点data->parent = tree;//返回return;}//不为空,则把数据的右子节点传入函数insertPerson(tree->rchild, data, compare);}}
//添加节点函数,外部调用
void initer(struct ABLtree* mytree, struct Person* data, int(*compare)(struct Person*, struct Person*))
{//判断ABLtree是否NULLif (!tree){return;}//判断插入的数据是否NULLif (!data){return;}//判断比较函数是否NULLif (!compare){return;}//如果根节点为空,把新添加的数据赋值给根节点,并返回if (!mytree->root){mytree->root = data;return;}//利用递归添加子节点insertPerson((mytree->root), data, compare);//调节平衡mytree->root=Adjtree(mytree->root);}

调节平衡

//计算树的高度
int getHight(struct Person* p)
{//如果节点不存在,返回0if (!p){return 0;}//计算左节点高度int m = getHight(p->lchild);//计算右节点高度int n = getHight(p->rchild);//左节点和右节点中的最大值+1return m > n ? ++m : ++n;
}
//向右旋转
struct Person* rightHand(struct Person* data)
{//记录当前节点struct Person* temp = data;//把当前节点的左节点赋值给当前节点data = data->lchild;//修改当前节点的父指向data->parent = temp->parent;
//记录修改后当前节点的右指向struct Person* myrchild = data->rchild;//把当前节点右指向赋值给以前节点的左指向temp->lchild = data->rchild;//如果不为空,修改父指向if (data->rchild){myrchild->parent = temp;}//把以前节点赋值给当前节点的右节点data->rchild = temp;//修改以前节点的父指向temp->parent = data;//返回修改后的节点return data;
}
//向左旋转
struct Person* leftHand(struct Person* data)
{//记录当前节点struct Person* temp = data;//把当前节点的右节点赋值给当前节点data = data->rchild;//修改当前节点的父指向data->parent = temp->parent;
//记录修改后当前节点的左指向struct Person* mylchild = data->lchild;//把当前节点左指向赋值给以前节点的右指向temp->rchild = data->lchild;//如果不为空,修改父指向if (mylchild){mylchild->parent = temp;}//把以前节点赋值给当前节点的左节点data->lchild = temp;//修改以前节点的父指向temp->parent = data;//返回修改后的节点return data;
}
struct Person* Adjtree(struct Person* tree)
{//如果节点为空,返回if (NULL == tree){return NULL;}//左节点或右节点有一个不为空才进行判断if (NULL != tree->lchild || NULL != tree->rchild){//把左右节点传入函数tree->lchild=Adjtree(tree->lchild);tree->rchild=Adjtree(tree->rchild);//计算左右节点的高度int l = getHight(tree->lchild);int r = getHight(tree->rchild);//判断左右节点的高度,如果左节点比右节高度多于1,进行旋转if ((l - r) > 1){//比较子节点的左右节点高度struct Person* data = tree->lchild;int ll = getHight(data->lchild);int rr = getHight(data->rchild);//如果右节点大于左节点if (rr > ll){//左旋一次tree->lchild=leftHand(data);}//右旋一次tree=rightHand(tree);}else//判断左右节点的高度,如果右节点比左节高度多于1,进行旋转if ((r - l) > 1){//比较子节点的左右节点高度struct Person* data = tree->rchild;int ll = getHight(data->lchild);int rr = getHight(data->rchild);//如果左节点大于右节点if (ll > rr){//右旋一次tree->rchild=rightHand(data);}//左旋一次tree=leftHand(tree);}}//返回修改后的节点return tree;
}

c语言手写平衡二叉树(一)相关推荐

  1. C语言手写二叉树(链式存储结构)

    C语言手写二叉树(链式存储结构) 二叉树结构 二叉树基本运算 代码 图例(main函数执行过程如下:) 阶段I 阶段II 阶段III 阶段IV 阶段V 先序遍历输出过程 二叉树结构 二叉树可以用顺序存 ...

  2. C语言手写自定义三维数组

    C语言手写三维数组 本文目的是通过C语言的结构体和动态数组,实现自定义类型的三维数组TripleArray及其基本运算 本文目的是通过C语言的结构体和动态数组,实现自定义类型的三维数组TripleAr ...

  3. C语言手写SDS字符串的实现思路

    C语言手写SDS字符串的实现思路 Simple Dynamic Strings (简称 SDS) 是一个 C 语言封装的的字符串,它增强了 C 语言字符串处理的能力. SDS 的 C 语言实现通常包括 ...

  4. C语言手写栈、手写计算器

    C语言实现表达式求值 文章结构 C语言手写栈Struct Stack 后缀表达式求值 中缀表达式转后缀表达式 文章结构 本文尝试通过纯C语言写一个计算器,在Visual Studio和VScode运行 ...

  5. C语言-手写任务队列

    C语言-手写任务队列 文章目录 C语言-手写任务队列 基本概念 头文件 队列实现 基本概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(Firs ...

  6. C语言手写魂斗罗(一)

    目录 1. 项目介绍 配套视频教程 2. 游戏效果演示 3. 项目准备 4. 创建项目 5. 实现游戏的启动界面 1. 项目介绍 使用C语言,手写魂斗罗经典游戏场景. 配套视频教程 视频讲解整个开发过 ...

  7. 柔宇发布“手写神器”柔记樱雪白特别版,支持7国语言手写识别

    深圳2018年9月26日电 /美通社/ -- 9月23日,柔宇科技在2018北京国际设计周期间首次对外发布柔宇科技的"柔性+"办公教育类升级新品 -- 柔记 RoWrite S 智 ...

  8. c语言手写指针和乘号,C-学会使用指针(示例代码)

    先说:唯手熟尔 指针 指针存储着一个内存空间的地址 定义一个指针 int a: int * p: 定义一个指针,只需在变量前面加一个 * 号.这里的指针只能存储一个存放整数的内存空间的地址 指针如何存 ...

  9. C语言手写快排算法,两个值时也可以使用哦!

    最近刷leetcode经常碰到排序问题,大家都知道排序算法中快速排序是效率很高的算法,因此快排写法是必须要掌握的哦! 解题思路 利用快排对数组进行排序. 快排:冒泡排序的改良. 快排目标:将数组从大到 ...

  10. C语言手写爱心-还原最新热剧撩妹代码

    目录 需求分析 代码效果 原理分析 爱心轨迹分析 轨迹测试 心形实现 动态心形分析 需求分析 最近这个爱心桥段火了!一个帅气高冷的学霸小哥,写了一个爱心代码,直接碾压了所有同学,并获得班花的迷之爱恋! ...

最新文章

  1. 历届华人 AAAI Fellows
  2. 经典mysql 语句收录
  3. TCP UDP 协议深度解析 (未完待续)
  4. 袁崇焕·任志强·张纪中
  5. 【文献学习】强化学习1:基于值函数的方法
  6. 人工智能行业有哪些岗位_建筑行业“七大员”是哪些岗位?职责是什么?
  7. MFC开发IM-用GDI函数画圆。可确定圆心的
  8. matlab与vc混合编程指导书.doc,vc与matlab混合编程—基于com.doc
  9. windows 终端查看python位置
  10. Win11如何自动关机 windows11自动关机的设置方法
  11. tp5在apache下能访问,但放到nginx下报404
  12. maven helper解决依赖冲突问题
  13. mysql reopen table_【MySql】关于临时表cann't reopen
  14. 《物理世界》公布2022年度十大突破
  15. 手机备忘录里的照片怎么保存到相册里
  16. 【Filecoin周报-62】倒计时1天,太空竞赛准备怎么样了?
  17. oracle官网数据库使用迅雷下载方法
  18. 友盟(https://www.umeng.com/)
  19. javascript基础:元素增删改操作
  20. 学习jqr2013-05-11

热门文章

  1. JAVA数组常见例题(转置,排序,求和平均,插入,删除)
  2. 人工智能的基础--知识分类
  3. 【python】启动客户端报错:OSError: [WinError 740] 请求的操作需要提升。
  4. java--------------
  5. p站,一个神奇的网站
  6. 推荐一款(网站图片储存)网站图片外链
  7. nodejs 中读取 package.json 文件内容
  8. removeclass 传入两个类_jQuery removeClass() 方法
  9. ltm4650_LTM4650IY-1APBF_代理全新进口【linear】现货商
  10. 东西湖职业技术学校计算机,武汉东西湖职业技术学校中专