AVL添加平衡二叉树,是一种二叉排序树,其中每个结点的左子树和右子树的高度差至多等于1。-icoding-数据结构-C-typedef struct node{ int val;

AVL添加


平衡二叉树,是一种二叉排序树,其中每个结点的左子树和右子树的高度差至多等于1。
它是一种高度平衡的二叉排序树。现二叉平衡树结点定义如下:

typedef struct node
{int val;struct node *left;struct node *right;struct node *parent;int height;
} node_t;

请实现平衡二叉树的插入算法:

向根为 root 的平衡二叉树插入新元素 val,成功后返回新平衡二叉树根结点

node_t *avl_insert(node_t *root, int val);#include <stdlib.h>
#include <stdio.h>
#include "avl.h"int get_height(node_t *p){if(!p)return 0;elsereturn p->height;
}

示例代码如下:

一定要超级仔细, 不然绝对后悔!


node_t* avl_insert(node_t *root, int val){
//首先清晰字母定义;
//val新插入结点元素值,height高度!!! 
//定义查找过程中出现的距离插入结点最近的平衡因子不为零的结点A
//定义A的孩子结点为B,需要旋转的结点
//定义插入节点为s,s的值为val
//平衡因子:左子树减去右子树深度 node_t *s, *A, *B, *C, *p, *fp;//依次:插入点, 失衡点(也可能是旋转点),旋转点,旋转点(也可能是插入点=s),动点,跟踪点int i, k;//平衡因子 s = (node_t *)malloc(sizeof(node_t));if(!s) return NULL;s->val = val;s->left = s->parent = s->right = NULL;s->height = 1;//类似于指针跟踪技术,p为动指针,A为跟踪指针 A = root; A->parent = NULL;p = root; p->parent = NULL;//找出A if(!p)root = s;else{while(p){//先找出最近的A->height!=0的结点, 就是最后的失衡点i = get_height(p->left) - get_height(p->right); if(i){A = p;A->parent = p->parent;}//fp跟踪p,因为下一步p会往下移动,p最终指向s的那一层 fp = p;if(val < p->val)p = p->left;elsep = p->right;}//p最终指向NULL就推出循环	 } //插入, 此时fp是p的前一个结点,p指向空 if(val < fp->val)fp->left = s;elsefp->right = s;//确定旋转结点B,修改A的平衡因子if(val < A->val)B = A->left;elseB = A->right;A->height++;//修改路径B到s的高度, B在A的下一层 p = B; // p最终指向s, 之前指向的是s这一层,但是是空while(p != s){p->height++;if(val < p->val)p = p->left; elsep = p->right;	}//最终s的高度没有++的 //调整完高度就修改结点和指针, 首先需要判断失衡类型//分为LL,LR,RR,RL//结点A,B平衡因子在修改指针的过程中会变化,但是路径上的结点不会//指针修改包括s结点指针和原来双亲结点指针 i = get_height(A->left) - get_height(A->right);k = get_height(B->left) - get_height(B->right); if(i == 2 && k == 1){//LL//B作为旋转结点//先改结点指针, 此时s插入在B的左子树下, 原来可以认为B左右子树,A右子树均为空A->left = B->right;B->right = A;//考虑原来A结点的指针,改成B后相应的指针也要改变,下面同理if(A->parent == NULL)root = B;else if(A->parent->left == A)A->parent->left = B;elseA->parent->right = B;		}else if(i == -2 && k == -1){//RRA->right = B->left;B->left = A;if(A->parent == NULL)root = B;else if(A->parent->left == A)A->parent->left = B;elseA->parent->right = B;	}else if(i == 2 && k == -1){//LR//此时认为C的左右子树空,B逆时针旋转,A顺时针旋转, s插入C的左子树或者右子树 //如果C结点也是空,也就是说B右子树空,那么直接插入C=s为B右子树,此时A右子树也是空的 C = B->right;B->right = C->left;A->left = C->right;C->left = B;C->right = A;if(A->parent == NULL)root = C;else if(A->parent->left == A)A->parent->left = C;elseA->parent->right = C;}else if(i == -2 && k == 1){//RL //和LR一样,画图来看就好C = B->left;A->right = C->left;B->left = C->right;C->left = A;C->right = B;if(A->parent == NULL)root = C;else if(A->parent->left == A)A->parent->left = C;elseA->parent->right = C;}return root;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[蓝桥杯2015决赛]密文搜索

题目描述 福尔摩斯从X星收到一份资料&#xff0c;全部是小写字母组成。 他的助手提供了另一份资料&#xff1a;许多长度为8的密码列表。 福尔摩斯发现&#xff0c;这些密码是被打乱后隐藏在先前那份资料中的。 请你编写一个程序&#xff0c;从第一份资料中搜索可能隐藏密码的位…

WTM系列视频教程:View和Taghelper

文字摘要&#xff1a;“又到了老刘胡说的时间了&#xff0c;今天我们主要聊一下View和TagHelper。在前后端不分离的模式下&#xff0c;View还是很重的一块。”“前几课有朋友反馈说收获很大&#xff0c;也有朋友反应基础内容太多&#xff0c;众口难调啊。这个系列教程还是希望有…

sketch里的ios控件_30个让你眼前一亮的iOS Swift UI控件!

前言笔者接触 iOS 开发有一段时间了&#xff0c;尤其特别喜欢UI部分&#xff0c;特意收集整理了30个让你惊艳的第三方开源控件&#xff08;swift&#xff09;&#xff0c;无论是应用到项目中还是用来学习都能让你大呼过瘾&#xff0c;废话不多说&#xff0c;直接上图上链接&…

堆辅助函数二叉堆是完全二叉树或者是近似完全二叉树。二叉堆有两种:最大堆和最小堆。“最小堆”的定义如下:typedef struct _otherInfo-icoding-C

堆辅助函数 二叉堆是完全二叉树或者是近似完全二叉树。二叉堆有两种&#xff1a;最大堆和最小堆。 最大堆(大顶堆)&#xff1a;父结点的键值总是大于或等于任何一个子节点的键值&#xff0c;即最大的元素在顶端&#xff1b; 最小堆(小顶堆)&#xff1a;父结点的键值总是小于或…

【要闻】Kubernetes不适合发行版模式、Windows业务无法达到营收指引

评论&#xff1a;发行版模式适用于Linux但不适用于Kubernetes人们经常将Kubernetes比喻成一种革命&#xff0c;众多相关公司纷纷涌现以利用其发展趋势证明了这一点。在从前&#xff0c;希望在Linux领域中赚钱的公司拿走了核心&#xff0c;将其与最佳实践和喜爱的应用程序捆绑在…

[蓝桥杯2015决赛]积分之迷-枚举(水题)

题目描述 小明开了个网上商店&#xff0c;卖风铃。共有3个品牌&#xff1a;A&#xff0c;B&#xff0c;C。 为了促销&#xff0c;每件商品都会返固定的积分。 小明开业第一天收到了三笔订单&#xff1a; 第一笔&#xff1a;3个A 7个B 1个C&#xff0c;共返积分&#xff1a;31…

python车辆识别硬件_Opencv python之车辆识别项目

图片车辆识别根据文章搭建好环境后开始进行做项目linkimport sysimport cv2from PyQt5.QtGui import *from PyQt5.QtWidgets import *from PyQt5.QtGui import QIcon, QPalette, QPixmap, QBrush, QRegExpValidatorclass mainWin(QWidget):def __init__(self):""&quo…

[蓝桥杯2016决赛]反幻方-next_permutation枚举

题目描述 我国古籍很早就记载着 2 9 4 7 5 3 6 1 8 这是一个三阶幻方。每行每列以及对角线上的数字相加都相等。 下面考虑一个相反的问题。 可不可以用 1~9 的数字填入九宫格&#xff0c;使得&#xff1a;每行每列每个对角线上的数字和都互不相等呢&#xff1f; 这应该能做到。…

堆初始化-二叉堆一般用数组来表示。例如,根节点在数组中的位置是0,第n个位置的子节点分别在2n+1和 2n+2-icoding-void init_min_heap(PMinHeap pq, int

堆初始化 二叉堆一般用数组来表示。例如&#xff0c;根节点在数组中的位置是0&#xff0c;第n个位置的子节点分别在2n1和 2n2。 因此&#xff0c;第0个位置的子节点在1和2&#xff0c;1的子节点在3和4。以此类推。这种存储方式便于寻找父节点和子节点。 在二叉堆上可以进行插入…

管理学定律--墨菲定律

如果有两种或两种以上的方式去做某件事情&#xff0c;而其中一种选择方式将导致灾难&#xff0c;则必定有人会做出这种选择。根本内容是&#xff1a;如果事情有变坏的可能&#xff0c;不管这种可能性有多小&#xff0c;它总会发生。一、墨菲定律来源1949年&#xff0c;一位名叫…

毕滢python小咖养成计划百度云_学技树-Python小咖养成计划

1.计算机操作基础.mp42.Python下载与配置.mp43.变量的概念.mp44.函数的调用和定义.mp45.数据的类型.mp46.字符串.mp47.if条件判断.mp48.while循环.mp49.for循环.mp410.列表.mp411.字典.mp412.类的概念.mp413.类的使用.mp4代码管理及答疑系统.pdf①项目一&#xff1a;数据分析(已…

[蓝桥杯2016决赛]平方末尾-数论,枚举

题目描述 能够表示为某个整数的平方的数字称为“平方数”。比如&#xff0c;25,64 虽然无法立即说出某个数是平方数&#xff0c;但经常可以断定某个数不是平方数。 因为平方数的末位只可能是&#xff1a;[0, 1, 4, 5, 6, 9] 这6个数字中的某个。 所以&#xff0c;4325435332必然…

数据结构-排序-分配类排序-知识点总结归纳3

分配类排序:核心是分配和收集,利用关键字的优先级进行排序的思想 高位优先排序:比如桥牌,先比较花色在比较面值;比如学号,比较级,院,班,号; 低位优先排序: 链式基数排序 思想:基于"分配"和"收集"的操作, 将单关键字转化为多关键字排序 将链表作为存储结…

Magicodes.IE基础教程之导出Pdf

说明本教程主要说明如何使用Magicodes.IE.Pdf完成Pdf收据导出要点导出PDF数据自定义PDF模板导出单据如何批量导出单据导出特性说明PdfExporterAttributePdfExporterAttribute特性用于设置Pdf导出的总体设置&#xff0c;比如方向、纸张等。主要包含如下设置&#xff1a;Name:文档…

mysql查询语句能否让一个字段不显示出来_天天写order by,你知道Mysql底层如何执行吗?

作者&#xff1a;不才陈某前言在实际的开发中一定会碰到根据某个字段进行排序后来显示结果的需求&#xff0c;但是你真的理解order by在 Mysql 底层是如何执行的吗&#xff1f;假设你要查询城市是苏州的所有人名字&#xff0c;并且按照姓名进行排序返回前 1000 个人的姓名、年龄…

排序-总结

排序 排序:重点在于对于记录的关键字进行排序,得到按关键字有序记录序列 分为: A.内部排序: 排序过程在内存中进行 B.外部排序: 待排序记录数据量过大,需要借助外部存储设备 排序的稳定性:排序后有相同关键字的记录顺序不变就是稳定的排序 插入类排序: 1.直接插入排…

.NET Core开发实战(第10课:环境变量配置提供程序)--学习笔记

10 | 环境变量配置提供程序&#xff1a;容器环境下配置注入的最佳途径环境变量的配置提供程序主要适应场景&#xff1a;1、在 Docker 中运行时2、在 Kubernetes 中运行时3、需要设置 ASP.NET Core 的一些内置特殊配置时环境变量和命令行这两个提供程序在早期是没有容器化的&…

python和qt哪个好_做个小的桌面用node还是QT比较好? - Web开发 - WebDev - 水木社区...

楼主说了自己水平不高&#xff0c;那就专注 py 一门语言就好了。electron 这边虽然现在已经简单了很多&#xff0c;但也是两个进程起步&#xff0c;main 和 renderer 进程的 api 又不一样&#xff0c;renderer 只有 node api 的子集。你大概觉得不挺简单的么&#xff0c;但对于…

堆元素插入 二叉堆一般用数组来表示。typedef struct _otherInfo{ int i; int j;}OtherInfo;-icoding-C-数据结构

堆元素插入 二叉堆一般用数组来表示。例如&#xff0c;根节点在数组中的位置是0&#xff0c;第n个位置的子节点分别在2n1和 2n2。 因此&#xff0c;第0个位置的子节点在1和2&#xff0c;1的子节点在3和4。以此类推。这种存储方式便于寻找父节点和子节点。 在二叉堆上可以进行插…