import { LinkedNode } from 'src/list';
import { CompareFn } from '..';
import { BinaryTreeNode } from './binaryTreeNode';
/**
 * @internal
 */
export interface Edge<Node extends BinaryTreeNode<unknown>> {
    label?: 'left' | 'right';
    from?: Node;
    to?: Node;
}
/**
 * [source](https://stackoverflow.com/questions/51419176/how-to-get-a-subset-of-keyof-t-whose-value-tk-are-callable-functions-in-typ)
 *
 * @internal
 *
export type KeyOfType<T, U> = {[K in keyof T]: T[K] extends U ? K: never}[keyof T];
*/
/**
 * @internal
 */
export declare function debug<N extends BinaryTreeNode<T>, T = any>(root: N | undefined, mapFn?: (node: N) => any): void;
/**
 * @internal
 */
export declare function removeStack<Node extends BinaryTreeNode<unknown>>(stack: LinkedNode<Edge<Node>>, dir?: boolean): LinkedNode<Edge<Node>>;
/**
 * @internal
 */
export declare function clone<T, Node extends BinaryTreeNode<T>>(node: undefined): undefined;
export declare function clone<T, Node extends BinaryTreeNode<T>>(node: Node): Node;
export declare function clone<T, Node extends BinaryTreeNode<T>>(node: Node | undefined): Node | undefined;
/**
 * @internal
 */
export declare function leftmost<Node extends BinaryTreeNode<unknown>>(node: undefined): undefined;
export declare function leftmost<Node extends BinaryTreeNode<unknown>>(node: Node): Node;
export declare function leftmost<Node extends BinaryTreeNode<unknown>>(node: Node | undefined): Node | undefined;
/**
 * @internal
 */
export declare function leftmostStack<Node extends BinaryTreeNode<unknown>>(stack: LinkedNode<Edge<Node>>): LinkedNode<Edge<Node>>;
/**
 * @internal
 */
export declare function inOrderTraverse<T, Node extends BinaryTreeNode<T>>(node: Node | undefined): Generator<Node>;
/**
 * @internal
 */
export declare function levelOrderTraverse<T, Node extends BinaryTreeNode<T>>(node: Node | undefined, padded?: false): Generator<Node>;
export declare function levelOrderTraverse<T, Node extends BinaryTreeNode<T>>(node: Node | undefined, padded: true): Generator<Node | undefined>;
/**
 * @internal
 */
export declare function postOrderTraverse<T, Node extends BinaryTreeNode<T>>(node: Node | undefined): Generator<Node>;
/**
 * @internal
 */
export declare function predecessor<Node extends BinaryTreeNode<unknown>>(node: Node | undefined): Node | undefined;
/**
 * @internal
 */
export declare function predecessorStack<Node extends BinaryTreeNode<unknown>>(stack: LinkedNode<Edge<Node>>): LinkedNode<Edge<Node>>;
/**
 * @internal
 */
export declare function preOrderTraverse<T, Node extends BinaryTreeNode<T>>(node: Node | undefined): Generator<Node>;
/**
 * @internal
 */
export declare function reverse<Node extends BinaryTreeNode<unknown>>(root?: Node): void;
/**
 * @internal
 */
export declare function rightmost<Node extends BinaryTreeNode<unknown>>(node: undefined): undefined;
export declare function rightmost<Node extends BinaryTreeNode<unknown>>(node: Node): Node;
export declare function rightmost<Node extends BinaryTreeNode<unknown>>(node: Node | undefined): Node | undefined;
/**
 * @internal
 */
export declare function rightmostStack<Node extends BinaryTreeNode<unknown>>(stack: LinkedNode<Edge<Node>>): LinkedNode<Edge<Node>>;
/**
 * Assumes sorted by compareFn
 * @internal
 */
export declare function search<T, Node extends BinaryTreeNode<T>>(element: T, node: Node | undefined, compareFn: CompareFn<T>): Node | undefined;
/**
 * Assumes sorted by compareFn
 * @internal
 */
export declare function searchStack<T, Node extends BinaryTreeNode<T>>(element: T, stack: LinkedNode<Edge<Node>>, compareFn: CompareFn<T>, dupeWeight?: number): LinkedNode<Edge<Node>>;
/**
 * @internal
 */
export declare function successor<Node extends BinaryTreeNode<unknown>>(node: Node | undefined): Node | undefined;
/**
 * @internal
 */
export declare function successorStack<Node extends BinaryTreeNode<unknown>>(stack: LinkedNode<Edge<Node>>): LinkedNode<Edge<Node>>;
/**
 * Turn an array into a binary tree. Assumes elements are in level-order.
 *
 * @internal
 */
export declare function toBinaryTree<T>(elements: (T | undefined)[] | undefined): BinaryTreeNode<T> | undefined;
