Поддержание баланса бинарного дерева, когда элементы вставляются по порядку

Мне интересно, есть ли подходящий алгоритм для поддержания баланса бинарного дерева, когда известно, что элементы всегда вставляются по порядку.

Одним из вариантов может быть использование стандартного метода создания сбалансированного дерева из отсортированного массива или связанного списка, как обсуждалось в этом вопросе, а также этом другом вопросе. Однако мне хотелось бы получить метод, при котором в дерево можно было бы вставить несколько элементов, выполнить поиск по ним, а затем добавить другие элементы, без необходимости разлагать дерево на список и создавать его заново.

Другим вариантом может быть использование одной из многочисленных реализаций самобалансирующихся деревьев, AVL, AA, Red-Black и т.д. и т.п. Однако все они накладывают определенные накладные расходы в процессе вставки, и мне интересно, есть ли способ избежать этого, учитывая ограничение, что элементы всегда вставляются в порядке возрастания.

Итак, для ясности, я хотел бы знать, существует ли метод, с помощью которого я могу поддерживать сбалансированное двоичное дерево, такое, что я могу вставить в него произвольный новый элемент в любой момент и сохранить баланс дерева, при условии, что новый элемент больше по порядку в дереве, чем все элементы, уже присутствующие в дереве.

В качестве примера, предположим, у меня есть следующее дерево:

       4
      / \
     /   \
    2     6
   / \   / \
  1   3 5   7

Есть ли простой способ сохранить баланс при вставке нового элемента, если я знаю, что этот элемент будет больше 7?

11
задан Community 23 May 2017 в 12:25
поделиться