107. Binary Tree Level Order Traversal II
Дан корень бинарного дерева. Верните обход значений узлов снизу вверх по уровням (то есть слева направо, уровень за уровнем, от листа к корню).
Пример:
Input: root = [3,9,20,null,null,15,7]
Output: [[15,7],[9,20],[3]]
C# решение
сопоставлено/оригиналpublic class Solution {
List<IList<int>> levels = new List<IList<int>>();
public void Helper(TreeNode node, int level) {
if (levels.Count == level)
levels.Add(new List<int>());
levels[level].Add(node.val);
if (node.left != null)
Helper(node.left, level + 1);
if (node.right != null)
Helper(node.right, level + 1);
}
public IList<IList<int>> LevelOrderBottom(TreeNode root) {
if (root == null)
return levels;
Helper(root, 0);
levels.Reverse();
return levels;
}
}
C++ решение
auto-draft, проверить перед отправкой#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
List<vector<int>> levels = new List<vector<int>>();
public void Helper(TreeNode node, int level) {
if (levels.size() == level)
levels.push_back(new List<int>());
levels[level].push_back(node.val);
if (node.left != null)
Helper(node.left, level + 1);
if (node.right != null)
Helper(node.right, level + 1);
}
public IList<vector<int>> LevelOrderBottom(TreeNode root) {
if (root == null)
return levels;
Helper(root, 0);
levels.Reverse();
return levels;
}
}
Java решение
сопоставлено/оригиналclass Solution {
List<List<Integer>> levels = new ArrayList<List<Integer>>();
public void helper(TreeNode node, int level) {
if (levels.size() == level) levels.add(new ArrayList<Integer>());
levels.get(level).add(node.val);
if (node.left != null) helper(node.left, level + 1);
if (node.right != null) helper(node.right, level + 1);
}
public List<List<Integer>> levelOrderBottom(TreeNode root) {
if (root == null) return levels;
helper(root, 0);
Collections.reverse(levels);
return levels;
}
}
JavaScript решение
сопоставлено/оригиналvar levelOrderBottom = function (root) {
let levels = [];
function helper(node, level) {
if (!node) return;
if (!levels[level]) levels[level] = [];
levels[level].push(node.val);
if (node.left) helper(node.left, level + 1);
if (node.right) helper(node.right, level + 1);
}
helper(root, 0);
return levels.reverse();
};
Python решение
сопоставлено/оригиналclass Solution:
def levelOrderBottom(self, root: Optional[TreeNode]) -> List[List[int]]:
levels = []
if not root:
return levels
def helper(node: Optional[TreeNode], level: int) -> None:
if len(levels) == level:
levels.append([])
levels[level].append(node.val)
if node.left:
helper(node.left, level + 1)
if node.right:
helper(node.right, level + 1)
helper(root, 0)
return levels[::-1]
Go решение
сопоставлено/оригиналfunc levelOrderBottom(root *TreeNode) [][]int {
levels := make([][]int, 0)
var helper func(node *TreeNode, level int)
helper = func(node *TreeNode, level int) {
if node == nil {
return
}
if len(levels) == level {
levels = append(levels, []int{})
}
levels[level] = append(levels[level], node.Val)
if node.Left != nil {
helper(node.Left, level+1)
}
if node.Right != nil {
helper(node.Right, level+1)
}
}
helper(root, 0)
for i := 0; i < len(levels)/2; i++ {
levels[i], levels[len(levels)-1-i] = levels[len(levels)-1-i], levels[i]
}
return levels
}
Algorithm
1️⃣
Инициализируйте список вывода levels. Длина этого списка определяет, какой уровень в данный момент обновляется. Вам следует сравнить этот уровень len(levels) с уровнем узла level, чтобы убедиться, что вы добавляете узел на правильный уровень. Если вы все еще находитесь на предыдущем уровне, добавьте новый уровень, вставив новый список в levels.
2️⃣
Добавьте значение узла в последний уровень в levels.
3️⃣
Рекурсивно обработайте дочерние узлы, если они не равны None, используя функцию helper(node.left / node.right, level + 1).
😎
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.