Вопрос:

Учитывая root бинарного дерева, представьте, что вы стоите на правой стороне от него, верните значения видимых узлов, упорядоченные сверху вниз.

Пример 1:

Input: root = [1,2,3,null,5,null,4]
Output: [1,3,4]

Решение:

В данной задаче нам нужно найти правильный вид бинарного дерева.

Правый вид означает узел, который мы увидим, если посмотрим на дерево с правой стороны.

Во-первых, мы проверим, является ли дерево null или нет.

if(!root) 
    return ;

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

Мы проверим, превышает ли текущий уровень максимальный уровень. Если да, то он будет виден с правой стороны дерева.

Как только мы получим узел, который присутствует с правой стороны, мы поместим этот узел в вектор ans.

if(h > maxh){
    ans.push_back(root -> val);
    maxh = h;
}

Следующим шагом является посещение правой стороны для правого представления двоичного дерева, а затем левой стороны.

traverse(root -> right, h + 1, maxh, ans);
traverse(root -> left, h + 1, maxh, ans);

Теперь в заданной функции проверьте, является ли дерево нулевым. Если да, то вернуть пустой вектор.

if(!root) 
    return {};

Корневое значение будет помещено в вектор, и будет вызвана функция перемещения.

ans.push_back(root -> val);
traverse(root, 0, maxh, ans);

Последний шаг — вернуть вектор ans.

return ans;

Ниже приведена полная реализация задачи:

Спасибо за прочтение!

S.