private void removeFoundNode(TreeNode removingNode) {
        TreeNode parentNode;

        if (removingNode.left == null || removingNode.right == null) {
            parentNode = removingNode;
        } else {
            parentNode = successor(removingNode);
            removingNode.value = parentNode.value;
        }

        TreeNode childNode;
        if (parentNode.left != null) {
            childNode = parentNode.left;
        } else {
            childNode = parentNode.right;
        }

        if (childNode != null) {
            childNode.parent = parentNode.parent;
        }

        if (parentNode.parent == null) {
            this.root = childNode;
        } else {
            if (parentNode == parentNode.parent.left) {
                parentNode.parent.left = childNode;
            } else {
                parentNode.parent.right = childNode;
            }
            recursiveBalance(parentNode.parent);
        }
        parentNode = null;
    }