数据结构—平衡二叉树
原理:参考趣学数据结构
代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct avlTree {int data;struct avlTree *lchild, *rchild;int height;
}avlTree;int height(avlTree* AVLTree);
void updateHeight(avlTree* &AVLTree);avlTree* LL(avlTree* &AVLTree) {avlTree* temp = AVLTree->lchild;AVLTree->lchild = temp->rchild;temp->rchild = AVLTree;updateHeight(temp);updateHeight(AVLTree);return temp;
}
avlTree* RR(avlTree* &AVLTree) {avlTree* temp = AVLTree->rchild;AVLTree->rchild=temp->lchild;temp->lchild = AVLTree;updateHeight(temp);updateHeight(AVLTree);return temp;
}
avlTree* LR(avlTree* &AVLTree) {AVLTree->lchild=RR(AVLTree->lchild);return LL(AVLTree);
}
avlTree* RL(avlTree* &AVLTree) {AVLTree->rchild = LL(AVLTree->rchild);return RR(AVLTree);
}
int height(avlTree* AVLTree) {int m, n;if (!AVLTree) {return 0;}else {m = height(AVLTree->lchild);n = height(AVLTree->rchild);if (m > n) {return m + 1;}else {return n + 1;}}
}
void updateHeight(avlTree* &AVLTree) {if (AVLTree) {AVLTree->height = height(AVLTree);updateHeight(AVLTree->lchild);updateHeight(AVLTree->rchild);}
}
avlTree* insertAVLTree(avlTree* &AVLTree,int e) {if (!AVLTree) {AVLTree = (avlTree*)malloc(sizeof(avlTree));AVLTree->data = e;AVLTree->lchild = AVLTree->rchild = NULL;AVLTree->height = 1;return AVLTree;}else {if (AVLTree->data == e) {printf("已经存在元素%d,不需要插入\n", e);return AVLTree;}if (e < AVLTree->data) {AVLTree->lchild = insertAVLTree(AVLTree->lchild, e);if (height(AVLTree->lchild) - height(AVLTree->rchild) == 2) {if (e > AVLTree->lchild->data) {AVLTree =LR(AVLTree);}else {AVLTree =LL(AVLTree);}}}else {AVLTree->rchild = insertAVLTree(AVLTree->rchild, e);if (height(AVLTree->rchild) - height(AVLTree->lchild) == 2) {if (AVLTree->rchild->data > e) {AVLTree =RL(AVLTree);}else {AVLTree =RR(AVLTree);}}}}updateHeight(AVLTree);return AVLTree;
}
void prePrint(avlTree* T) {if (T) {printf("%d ", T->data);prePrint(T->lchild);prePrint(T->rchild);}
}
int main() {avlTree* T = NULL;int count, data;printf("开始构造avl:\n输入avl结点的数目:");scanf_s("%d", &count);int counts = 0;while (count--) {counts += 1;printf("输入avl的第%d个结点:", counts);scanf_s("%d", &data);insertAVLTree(T, data);}printf("前序遍历avl\n");prePrint(T);printf("\n");system("pause");return 0;
}
测试截图:
时间复杂度O(logn),空间复杂度O(1)
如果存在什么问题,欢迎批评指正!谢谢!