Рубрики
Без рубрики

Решение: добавьте один ряд в дерево

Это является частью серии объяснений решений LeetCode (индекс). Если вам понравилось это решение или fou … с меткой алгоритмы, JavaScript, Java, Python.

LeetCode Solutions (161 серия деталей)

Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашли его полезным, Пожалуйста, нравится Этот пост и/или upvote Мое решение по сообщению на форумах LeetCode Анкет

Проблема LeetCode #623 (Medium): добавьте один ряд в дерево

Описание:

( прыгнуть в : Идея решения Код : JavaScript | Python | Java | C++

Учитывая корень двоичного дерева, затем значение V и глубина D , вам нужно добавить ряд узлов с значением v на данной глубине d . корень Узел находится на глубине 1 Анкет

Правило добавления: дана положительная целочисленная глубина D , для каждого не нулевого дерева узлов деревьев N в глубине D-1 , Создайте два узла дерева со значением v как N Слева корень поддерево и правый корень поддерево. И N S Оригинал слева поддерево Должен быть левый поддерек нового левого корня поддерево, это Оригинальный правый поддерек должен быть правильным поддереем нового корня правого поддерева. Если глубина D это 1 Это означает, что нет глубины D-1 вообще, затем создайте узел дерева со значением v Как новый корень всего оригинального дерева, и оригинальное дерево является левым поддереем нового корня.

Примеры:

Вход: Бинарное дерево следующим образом:
Выход:
Вход: Бинарное дерево следующим образом:
Выход:

Ограничения:

  • Данный D в диапазоне [1, максимальная глубина данного дерева + 1] Анкет
  • Данное двоичное дерево имеет по крайней мере один узел дерева.

Идея:

( прыгнуть к : Описание проблемы Код : JavaScript | Python | Java | C++

Мы могли бы определенно решить это несколько способов, но я всегда неравнодушен к рекурсия Когда это возможно, особенно если вы можете просто повторить основную функцию, а не определять отдельную рекурсивную вспомогательную функцию. Рекурсивный маршрут – это Глубина-первый поиск ( dfs ) Решение Анкет

Мы можем использовать переменную глубины ( d ) в качестве вида обратного отсчета, уменьшая ее, когда мы проходим вниз по дереву, пока не доберемся до нашей строки назначения. Поскольку нам нужно будет прикрепить новые узлы на D Для их родителей мы должны выполнить нашу деятельность, когда D , а не D , чтобы у нас был доступ к родительскому узлу.

Это также позволяет нам справиться с липким краем, когда исходное значение d это 1 Анкет Поскольку не существует родителей для оригинала корень , нам придется просто создать наш новый узел и прикрепить корень к нему до возвращение Анкет Это может произойти только на начальном вызове функции, так как в противном случае мы никогда не достигнем D в любой более поздней рекурсии.

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

Это работает, потому что мы проходим Узел Ссылки Благодаря рекурсии, поэтому объект дерева модифицируется независимо от возвращаемых значений.

Реализация:

Код почти идентичен между всеми четырьмя языками.

Код JavaScript:

( прыгнуть к : Проблема Описание Идея решения

var addOneRow = function(root, v, d) {
    if (d === 1) return new TreeNode(v, root, null)
    if (d === 2) {
        root.left = new TreeNode(v, root.left, null)
        root.right = new TreeNode(v, null, root.right)
    } else {
        if (root.left) addOneRow(root.left, v, d-1)
        if (root.right) addOneRow(root.right, v, d-1)
    }
    return root
};

Код Python:

( прыгнуть к : Проблема Описание Идея решения

class Solution:
    def addOneRow(self, root: TreeNode, v: int, d: int) -> TreeNode:
        if d == 1: return TreeNode(v, root, None)
        elif d == 2:
            root.left = TreeNode(v, root.left, None)
            root.right = TreeNode(v, None, root.right)
        else:
            if root.left: self.addOneRow(root.left, v, d-1)
            if root.right: self.addOneRow(root.right, v, d-1)
        return root

Код Java:

( прыгнуть к : Проблема Описание Идея решения

class Solution {
    public TreeNode addOneRow(TreeNode root, int v, int d) {
        if (d == 1) return new TreeNode(v, root, null);
        else if (d == 2) {
            root.left = new TreeNode(v, root.left, null);
            root.right = new TreeNode(v, null, root.right);
        } else {
            if (root.left != null) addOneRow(root.left, v, d-1);
            if (root.right != null) addOneRow(root.right, v, d-1);
        }
        return root;
    }
}

C ++ Код:

( прыгнуть к : Проблема Описание Идея решения

class Solution {
public:
    TreeNode* addOneRow(TreeNode* root, int v, int d) {
        if (d == 1) return new TreeNode(v, root, NULL);
        else if (d == 2) {
            root->left = new TreeNode(v, root->left, NULL);
            root->right = new TreeNode(v, NULL, root->right);
        } else {
            if (root->left) addOneRow(root->left, v, d-1);
            if (root->right) addOneRow(root->right, v, d-1);
        }
        return root;
    }
};

LeetCode Solutions (161 серия деталей)

Оригинал: “https://dev.to/seanpgallivan/solution-add-one-row-to-tree-1lc2”