news 2026/8/3 7:07:12

AVL树的构建

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AVL树的构建

在搜索一定量的资料后发现有两种构建方式,其中一种是设置parent指针,从而能在将节点穿插到最下面后进行回溯,只实际上是最朴素的做法。

我们采用第二种做法,就是将AVL树的构建用递归回溯的方法进行,顺序是这样:首先插入节点,接着检查这个节点是否满足balance,不满足则进行旋转,之后再更新节点的高度(不管有没有旋转) , 这个递归实际上就是不断向下直到递归到了最底层,然后将节点插入到最底层之后就会有一个回溯,回溯过程刚好也能满足求高度的条件(下面的节点的高度都已经求出来了),因此能够顺便把沿途每个节点的高度都求出来,但是我们每次并不急着求高度,而是先判断符不符合要求,并且进行旋转。因为如果我们先去求高度的话得到的点旋转后会变,就会使得操作无效。这个过程之中我们便可以将沿路上的不满足平衡的节点全部都给弄平衡了。注意旋转中里面需要更新高度,因为有的节点高度会变。

还有很关键的一点,AVL树某个节点为根变换时这个位置的根节点变了,但其高度不变,这可以避免退化出现平衡因子绝对值大于2的情况

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct AVLNode { char data; int height; struct AVLNode *lchild , *rchild; }AVLNode; int Height(AVLNode* node) { if(node == NULL) return 0; else return node -> height; } int Max(int a , int b) { if(a > b) return a; else return b; } AVLNode* LL(AVLNode** T) { AVLNode* son = (*T) -> lchild; (*T) -> lchild = son -> rchild; son -> rchild = (*T); (*T) -> height = Max(Height((*T) -> lchild) , Height((*T) -> rchild)) + 1; son -> height = Max(Height(son -> lchild) , Height(son -> rchild)) + 1; return son; } AVLNode* RR(AVLNode** T) { AVLNode* son = (*T) -> rchild; (*T) -> rchild = son -> lchild; son -> lchild = (*T); (*T) -> height = Max(Height((*T) -> lchild) , Height((*T) -> rchild)) + 1; son -> height = Max(Height(son -> lchild) , Height(son -> rchild)) + 1; return son; } AVLNode* RL(AVLNode** T) { AVLNode* son = (*T) -> rchild -> lchild; (*T) -> rchild = LL(&((*T) -> rchild)); (*T) = RR(T); return son; } AVLNode* LR(AVLNode** T) { AVLNode* son = (*T) -> lchild -> rchild; (*T) -> lchild = RR(&((*T) -> lchild)); (*T) = LL(T); return son; } void Insert(AVLNode** T , char x) { if((*T) == NULL) { AVLNode* p = (AVLNode*) malloc (sizeof(AVLNode)); p -> data = x; p -> lchild = NULL; p -> rchild = NULL; p -> height = 1; (*T) = p; return; } else { if(x < (*T) -> data) { Insert(&((*T) -> lchild) , x); if(Height((*T) -> lchild) - Height(((*T) -> rchild)) > 1) { if((*T) -> lchild -> data < x) (*T) = LR(T); else (*T) = LL(T); } } else if(x > (*T) -> data) { Insert(&((*T) -> rchild) , x); if(Height((*T) -> lchild) - Height(((*T) -> rchild)) < -1) { if((*T) -> rchild -> data < x) (*T) = RR(T); else (*T) = RL(T); } } (*T) -> height = Max(Height((*T) -> lchild) , Height((*T) -> rchild)) + 1; } } void Print(AVLNode* T , int layer) { if(T != NULL) { Print(T -> rchild, layer + 1); for(int i = 0 ; i < layer ; i ++) printf(" "); printf("%c\n" , T -> data); Print(T -> lchild , layer + 1); } } void Pre_print(AVLNode* T) { if(T != NULL) { printf("%c" , T -> data); Pre_print(T -> lchild); Pre_print(T -> rchild); } } void Mid_print(AVLNode* T) { if(T != NULL) { Mid_print(T -> lchild); printf("%c" , T -> data); Mid_print(T -> rchild); } } void Post_print(AVLNode* T) { if(T != NULL) { Post_print(T -> lchild); Post_print(T -> rchild); printf("%c" , T -> data); } } int main() { char a[100]; scanf("%s" , a); AVLNode* T = NULL; for(int i = 0 ; i < strlen(a) ; i ++) { Insert(&T , a[i]); } printf("Preorder: "); Pre_print(T); printf("\n"); printf("Inorder: "); Mid_print(T); printf("\n"); printf("Postorder: "); Post_print(T); printf("\n"); printf("Tree:\n"); Print(T , 0); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/2 11:39:01

如何3步搞定Flink状态监控?从新手到专家的避坑指南

如何3步搞定Flink状态监控&#xff1f;从新手到专家的避坑指南 【免费下载链接】flink 项目地址: https://gitcode.com/gh_mirrors/fli/flink 你是否经历过这样的场景&#xff1a;凌晨两点被告警吵醒&#xff0c;Flink任务又因为状态过大而崩溃了&#xff1f;或者发现C…

作者头像 李华
网站建设 2026/8/1 3:45:27

EmotiVoice让公共交通信息传达更高效

EmotiVoice&#xff1a;让公共交通的语音播报“有温度” 在早晚高峰的地铁站里&#xff0c;你是否曾被千篇一律、毫无起伏的机械女声搞得心烦意乱&#xff1f;当列车突然延误时&#xff0c;一条语气平静如常的“本班列车将晚点十分钟”广播&#xff0c;真的能让人意识到事态紧急…

作者头像 李华
网站建设 2026/8/1 18:06:40

模型上下文协议(MCP)完全指南:从AI代理痛点到实战开发

模型上下文协议&#xff08;MCP&#xff09;完全指南&#xff1a;从AI代理痛点到实战开发 &#x1f50d; MCP基础与核心价值&#xff08;背景&#xff09; (一) AI代理的局限性 LLM原生能力边界&#xff1a;大型语言模型&#xff08;LLM&#xff09;仅能生成文本/图像等内容…

作者头像 李华
网站建设 2026/8/3 4:04:22

Uppy文件过滤实战指南:从基础限制到智能校验

Uppy文件过滤实战指南&#xff1a;从基础限制到智能校验 【免费下载链接】uppy The next open source file uploader for web browsers :dog: 项目地址: https://gitcode.com/gh_mirrors/up/uppy 还在为文件上传的混乱管理而烦恼吗&#xff1f;用户上传了错误格式的图片…

作者头像 李华
网站建设 2026/8/3 1:26:51

Flash TOOL刷机下载工具 V5 和 V6

SP_Flash_Tool_V5Download- agent 选项&#xff1a;D:\SP_Flash_Tool_Selector_exe_Windows_v1.2444.00.000\SP_Flash_Tool_V5\\MTK_AllInOne_DA.binScatter-loading File 选项&#xff1a;out下去找\\192.168.17.4\ssd1\R0\out\target\product\em50b62_shks_e55_n61_dz2\MT676…

作者头像 李华
网站建设 2026/8/3 14:03:19

如何在浏览器中精准控制AI输出?WebLLM日志处理器的5大实战技巧

如何在浏览器中精准控制AI输出&#xff1f;WebLLM日志处理器的5大实战技巧 【免费下载链接】web-llm 将大型语言模型和聊天功能引入网络浏览器。所有内容都在浏览器内部运行&#xff0c;无需服务器支持。 项目地址: https://gitcode.com/GitHub_Trending/we/web-llm 当你…

作者头像 李华