news 2026/8/10 10:57:40

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/7 21:25:01

如何申请EmotiVoice商用授权许可?

如何申请 EmotiVoice 商用授权许可 在虚拟主播一夜爆红、AI 配音席卷短视频平台的今天&#xff0c;语音合成技术早已不再是实验室里的冷门研究。用户对“像人一样说话”的 AI 声音越来越挑剔——他们不要机械朗读&#xff0c;而要能哭会笑、有情绪起伏的声音。正是在这种需求驱…

作者头像 李华
网站建设 2026/8/9 12:53:14

【2025年华为秋招(AI)-12月17日-第二题(200分)- 使用线性回归预测手机售价】(题目+思路+JavaC++Python解析+在线测试)

题目内容 手机的售价跟手机的软硬件特性有关系。硬件规格越高、软件特性越丰富,则手机给消费者提供的价值越大,同时手机的售价越高。我们在市面上收集了若干款手机,从硬件能力、系统流畅度、 A I AI AI能力 3 3 3个方面对这些手机进行打分,并记录这些手机的分数和售价。请…

作者头像 李华
网站建设 2026/8/7 12:25:01

Leon Sans字体引擎:零代码基础打造炫酷文字动画

Leon Sans字体引擎&#xff1a;零代码基础打造炫酷文字动画 【免费下载链接】leonsans Leon Sans is a geometric sans-serif typeface made with code in 2019 by Jongmin Kim. 项目地址: https://gitcode.com/gh_mirrors/le/leonsans 还在为网页文字效果单调而烦恼吗&…

作者头像 李华
网站建设 2026/8/9 5:14:43

Obsidian网页剪藏完整指南:从零开始的高效知识管理方案

Obsidian网页剪藏完整指南&#xff1a;从零开始的高效知识管理方案 【免费下载链接】obsidian-clipper Highlight and capture the web in your favorite browser. The official Web Clipper extension for Obsidian. 项目地址: https://gitcode.com/gh_mirrors/obsidia/obsi…

作者头像 李华
网站建设 2026/8/7 15:45:17

终极指南:如何在不受支持的设备上免费启用Sidecar功能

终极指南&#xff1a;如何在不受支持的设备上免费启用Sidecar功能 【免费下载链接】free-sidecar Enable Sidecar on Unsupported iPads and Macs running iPadOS 13 and macOS Catalina 项目地址: https://gitcode.com/gh_mirrors/fr/free-sidecar 你是否曾经羡慕那些拥…

作者头像 李华