#include <stdio.h> #include <algorithm> using namespace std; struct node{ int v,height; node *lchild; node *rchild; }; //生成一个新节点 node* newNode(int v){ node* Node = new node; Node->v = v; Node->height = 1; Node->lchild = Node->rchild = NULL; return Node; } //获取以root为根节点的子树的当前height int getheight(node* root){ if(root == NULL) return 0; return root->height; } //计算节点root的平衡因子 int getbalancefactor(node* root){ return getheight(root->lchild) - getheight(root->rchild); } //更新节点root的height void updateheight(node* root){ root->height = max(getheight(root->lchild),getheight(root->rchild)) + 1; } //search查找AVL树中数据域为x的节点 void search(node* root,int x){ if(root == NULL){ printf("search failed\n"); return; } if(x == root->v){ printf("%d\n",root->v); } else if(x < root->v){ search(root->lchild,x); } else{ search(root->rchild,x); } } //中序遍历这棵AVL树 void inorder(node* root){ if(root == NULL){ return; } else{ inorder(root->lchild); printf("%d ",root->v); inorder(root->rchild); } } //左旋 void L(node* &root){ node* temp = root->rchild; root->rchild = temp->lchild; temp->lchild = root; updateheight(root); updateheight(temp); root = temp; } //右旋 void R(node* &root){ node* temp = root->lchild; root->lchild = temp->rchild; temp->rchild = root; updateheight(root); updateheight(temp); root = temp; } //插入权值为v的节点 void insert(node* &root,int v){ if(root == NULL){ root = newNode(v); return; } if(v <root->v){ insert(root->lchild,v); updateheight(root); if(getbalancefactor(root) == 2){ if(getbalancefactor(root->lchild) == 1){ R(root); } else if(getbalancefactor(root->lchild) == -1){ L(root->lchild); R(root); } } } else{ insert(root->rchild,v); updateheight(root); if(getbalancefactor(root) == -2){ if(getbalancefactor(root->rchild) == -1){ L(root); } else if(getbalancefactor(root->rchild) == 1){ R(root->rchild); L(root); } } } } //AVL树的建立 node* Creat(int data[],int n){ node* root = NULL; for(int i = 0;i <n;i++){ insert(root,data[i]); } return root; } int main(){ int data[10] = {1,2,4,6,3,5,7,9,8,10};//把这几个数字调换顺序,得到的AVL树中序遍历相同 node* root = NULL; node* linshi = Creat(data,10); printf("中序遍历这棵AVL树输出为:\n"); inorder(linshi); printf("\n查找AVL树中数据域为100的节点\n"); search(linshi,100); } 转载自`https://blog.csdn.net/weixin_42377217/article/details/104155404` 感觉找了特别久才找到这个,大佬程序写的非常棒,结构清晰,再次鸣谢大佬,想了解更多的可以点链接去找大佬主页。