Поиск K-ого в BST

В следующих задачах нужно найти k-ый наименьший и k-ый наибольший элемент в BST. Направленный спуск тут не поможет — нужен другой инструмент.

Посмотри на дерево ниже и попробуй применить такой алгоритм:

  1. Если вершина пустая — возвращаемся к родителю
  2. Идём в левого ребёнка
  3. Добавляем значение текущей вершины в конец списка
  4. Идём в правого ребёнка

Получится [1, 3, 4, 6, 7, 8, 10, 14] — отсортированный массив. Это не совпадение. Такой обход называется центрированным (inorder) и при запуске на BST мы всегда получим отсортированный порядок.

using System.Collections.Generic;

public class Solution
{
    public static void Inorder(TreeNode node, List<int> result)
    {
        if (node == null)
        {
            return;
        }

        Inorder(node.left, result);
        result.Add(node.val);
        Inorder(node.right, result);
    }
}

Если вместо сбора в массив считать количество обойдённых элементов — можно найти k-ый наименьший или наибольший элемент без дополнительной памяти. При решении следующей задачи подумай, как это реализовать и что поменять в обходе для поиска k-ого наибольшего/наименьшего.