dsf

 avatar
unknown
abap
2 years ago
2.2 kB
5
Indexable
#include <iostream>
using namespace std;

struct node {
    int key;
    struct node* left;
    struct node* right;
    int height;
};

int getheight(struct node* n) {
    if (n == NULL)
        return 0;
    return n->height;
}

struct node* createnode(int key) {
    struct node* node = new struct node;
    node->key = key;
    node->left = NULL;
    node->right = NULL;
    node->height = 1;
    return node;
}

int max(int a, int b) {
    return (a > b) ? a : b;
}

int getbalancefactor(struct node* n) {
    if (n == NULL) {
        return 0;
    }
    return getheight(n->left) - getheight(n->right);
}

struct node* rightrotate(struct node* y) {
    struct node* x = y->left;
    struct node* T2 = x->right;
    x->right = y;
    y->left = T2;
    x->height = max(getheight(x->right), getheight(x->left));
    y->height = max(getheight(y->right), getheight(y->left));
    return x;
}

struct node* leftrotate(struct node* x) {
    struct node* y = x->right;
    struct node* T2 = y->left;
    y->left = x;
    x->right = T2;
    x->height = max(getheight(x->right), getheight(x->left));
    y->height = max(getheight(y->right), getheight(y->left));
    return y;
}

struct node* insert(struct node* node, int key) {
    if (node == NULL)
        return createnode(key);
    if (key < node->key)
        node->left = insert(node->left, key);
    else if (key > node->key)
        node->right = insert(node->right, key);

    node->height = 1 + max(getheight(node->left), getheight(node->right));
    int bf = getbalancefactor(node);
    if (bf > 1 && key < node->left->key) {
        return rightrotate(node);
    }
    if (bf < -1 && key > node->right->key) {
        return leftrotate(node);
    }
    return node;
}

void inorder(struct node* root) {
    if (root != NULL) {
        inorder(root->left);
        cout << root->key << " ";
        inorder(root->right);
    }
}

int main() {
    struct node* root = NULL;
    root = insert(root, 32);
    root = insert(root, 4);
    root = insert(root, 34);
    root = insert(root, 2);
    root = insert(root, 30);
    root = insert(root, 8);
    inorder(root);
    return 0;
}
Editor is loading...