import { BinarySearchTree } from "./BinarySearchTree";
import { Element } from "../Collection";
import { BinaryTreeNode } from "./BinaryTreeNode";
/**
 * In computer science, an `AVL tree` (named after inventors Adelson-Velsky and Landis) is a
 * self-balancing binary search tree. It was the first such data structure to be invented.
 * In an AVL tree, the heights of the two child subtrees of any node differ by at most one;
 * if at any time they differ by more than one, rebalancing is done to restore this property.
 * Lookup, insertion, and deletion all take O(log n) time in both the average and worst cases,
 * where n is the number of nodes in the tree prior to the operation. Insertions and deletions
 * may require the tree to be rebalanced by one or more tree rotations.
 */
export declare class AvlTree<K, V = K> extends BinarySearchTree<K, V> {
    /**
     * @param {K} key
     * @param {Element} value
     */
    add(key: K, value: Element<V>): BinaryTreeNode<K, V>;
    /**
     * @param {K} key
     * @return {boolean}
     */
    remove(key: K): Element<V> | undefined;
    /**
     * @param {BinaryTreeNode} node
     */
    private balance;
    /**
     * @param {BinaryTreeNode} rootNode
     */
    private rotateLeftLeft;
    /**
     * @param {BinaryTreeNode} rootNode
     */
    private rotateLeftRight;
    /**
     * @param {BinaryTreeNode} rootNode
     */
    private rotateRightLeft;
    /**
     * @param {BinaryTreeNode} rootNode
     */
    private rotateRightRight;
}
