Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- struct data {
- int angka;
- struct data *kiri;
- struct data *kanan;
- };
- struct data *root = NULL;
- int tinggi (struct data *temp){
- int h = 0;
- if (temp != NULL) {
- int tinggi_kiri = tinggi (temp->kiri);
- int tinggi_kanan = tinggi (temp->kanan);
- int tinggi_max;
- if (tinggi_kiri > tinggi_kanan) {
- tinggi_max = tinggi_kiri;
- } else {
- tinggi_max = tinggi_kanan;
- }
- h = tinggi_max + 1;
- }
- return h;
- }
- int difference(struct data *temp){
- int tinggi_kiri = tinggi (temp->kiri);
- int tinggi_kanan = tinggi (temp->kanan);
- int b_faktor = tinggi_kiri - tinggi_kanan;
- return b_faktor;
- }
- struct data *rr_rotasi(struct data *parent){
- struct data *temp;
- temp = parent->kanan;
- parent->kanan = temp->kiri;
- temp->kiri = parent;
- return temp;
- }
- struct data *ll_rotasi(struct data *parent){
- struct data *temp;
- temp = parent->kiri;
- parent->kiri = temp->kanan;
- temp->kanan = parent;
- return temp;
- }
- struct data *lr_rotasi(struct data *parent){
- struct data *temp;
- temp = parent->kiri;
- parent->kiri = rr_rotasi(temp);
- return ll_rotasi(parent);
- }
- struct data *rl_rotasi(struct data *parent){
- struct data *temp;
- temp = parent->kanan;
- parent->kanan = ll_rotasi(temp);
- return rr_rotasi(parent);
- }
- struct data *balance(struct data *temp){
- int bal_faktor = difference(temp);
- if (bal_faktor > 1) {
- if (difference(temp->kiri) > 0) {
- temp = ll_rotasi(temp);
- } else {
- temp = lr_rotasi(temp);
- }
- } else if (bal_faktor < -1) {
- if (difference(temp->kanan) > 0) {
- temp = rl_rotasi(temp);
- } else {
- temp = rr_rotasi(temp);
- }
- }
- return temp;
- }
- struct data *insert(struct data *root){
- struct data *new_cus;
- int angka;
- do {
- printf("Masukkan Angka : ");
- scanf("%d", &angka);
- getchar();
- } while(angka < 0 || angka > 100);
- new_cus = (struct data *)malloc(sizeof(struct data));
- if (root == NULL) {
- root = new_cus;
- root->angka = angka;
- root->kiri = NULL;
- root->kanan = NULL;
- return root;
- } else if (angka < root->angka) {
- root->kiri = insert(root->kiri);
- root = balance (root);
- } else if (angka >= root->angka) {
- root->kanan = insert(root->kanan);
- root = balance (root);
- }
- printf("Input Data Berhasil ...");
- getchar();
- return root;
- }
- void tampil(struct data *ptr, int level){
- int a;
- system("clear");
- if (ptr != NULL) {
- tampil(ptr->kanan, level + 1);
- printf("\n");
- if (ptr == root)
- printf("ROOT -> : ");
- for (a = 0; a < level && ptr != root; a++)
- printf(" ");
- printf("%d", ptr->angka);
- tampil(ptr->kiri, level + 1);
- }
- }
- //INORDER => Left Node Right//
- void tampilinorder(struct data *root){
- if (root != NULL) {
- /*LEFT*/ tampilinorder(root->kiri);
- /*NODE*/ printf("-%d\n", root->angka); //NODE
- /*RIGHT*/ tampilinorder(root->kanan);
- }
- }
- void menu(){
- printf("AVL TREE\n");
- printf("========\n\n");
- printf("1. Insert Data\n");
- printf("2. Tampilkan Tree\n");
- printf("3. Exit\n");
- }
- int main(){
- int pilih;
- while (pilih != 3) {
- do {
- system("clear");
- menu();
- printf("Masukkan Pilihan Yang Diinginkan : ");
- scanf("%d", &pilih);
- getchar();
- } while(pilih < 0 || pilih > 3);
- if (pilih == 1) {
- root = insert(root);
- } else if (pilih == 2) {
- if (root == NULL) {
- printf("Data Tree Kosong, Harap Masukkan Data Terlebih Dahulu");
- getchar();
- } else {
- tampil(root, 1);
- }
- } else if (pilih == 3) {
- printf("Terima Kasih Telah Menggunakan Aplikasi Ini, Kenyamanan Anda Adalah Prioritas Kami ^_^");
- getchar();
- break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement