zoukankan      html  css  js  c++  java
  • HackerRank "Self Balancing Tree"

    Something to learn: Rotation ops in AVL tree does not require recursion
    https://github.com/andreimaximov/hacker-rank/blob/master/data-structures/tree/self-balancing-tree/main.cpp

    node *create_node(int val)
    {
        node *pNew = new node;
        pNew->val = val;
        pNew->ht  = 0;
        pNew->left = pNew->right = nullptr;
        
        return pNew;
    }
    
    int height(node *p)
    {
        if(!p) return -1;
        return p->ht;
    }
    
    int get_height(node *p)
    {
        if (!p) return 0;
        return 1 + max(height(p->left), height(p->right));
    }
    
    node *right_rotate(node *p)
    {
        node *pOrigRoot = p;
        node *root = p->left;
        pOrigRoot->left = root->right;
        root->right = pOrigRoot;
        
        pOrigRoot->ht = get_height(pOrigRoot);
        root->ht = get_height(root);
        
        return root;
    }
    
    node *left_rotate(node *p)
    {
        node *pOrigRoot = p;
        node *root = p->right;
        pOrigRoot->right = root->left;
        root->left = pOrigRoot;
        
        pOrigRoot->ht = get_height(pOrigRoot);
        root->ht = get_height(root);
        
        return root;
    }
    
    int balance_factor(node *p)
    {
        if (!p) return 0;
        return height(p->left) - height(p->right);
    }
    
    node *balance(node *p)
    {
        int w = balance_factor(p);
    
        if (!p || abs(w) < 2)
            return p;
        
        if (w > 0)
        {
            if(balance_factor(p->left) < 0)
            {
                p->left = left_rotate(p->left);
            }
            return right_rotate(p);
        }
        else
        {
            if(balance_factor(p->right) > 0)
            {
                p->right = right_rotate(p->right);
            }
            return left_rotate(p);
        }
        
        return p;
    }
    
    node * insert(node * root,int val)
    {
        if (val < root->val)
        {
            if(!root->left)
            {
                root->left = create_node(val);
            }
            else
            {
                root->left = insert(root->left, val);
            }
        }
        else
        {
            if(!root->right)
            {
                root->right = create_node(val);
            }
            else
            {
                root->right = insert(root->right, val);
            }
        }
        root->ht = get_height(root);
        
        return balance(root);
    }
    View Code
  • 相关阅读:
    NFS服务
    DNS服务
    git使用笔记(七)版本回退和撤销
    git使用笔记(六)github
    git使用笔记(五)打标签
    git使用笔记(四)远程操作
    git使用笔记(三)文件忽略
    git使用笔记(二)分支与合并
    git使用笔记(一)入门
    GDB使用小记
  • 原文地址:https://www.cnblogs.com/tonix/p/4983630.html
Copyright © 2011-2022 走看看