Сложность: medium
Учитывая целое число n, верните список всех возможных полных бинарных деревьев с узлами. Каждый узел каждого дерева в ответе должен иметь Node.val == 0. Каждый элемент ответа является корневым узлом одного возможного дерева. Вы можете вернуть конечный список деревьев в любом порядке. Полное бинарное дерево - это бинарное дерево, в котором каждый узел имеет ровно 0 или 2 дочерних.
Пример:
Input: n = 7
Output: [[0,0,0,null,null,0,0,null,null,0,0],[0,0,0,null,null,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,null,null,null,null,0,0],[0,0,0,0,0,null,null,0,0]]
👨💻 Алгоритм:
1⃣Если n четное, вернуть пустой список, так как полное бинарное дерево не может иметь четное количество узлов.
2⃣Если n == 1, вернуть дерево с одним узлом. Для всех возможных значений i от 1 до n-1 с шагом 2: Создать левое поддерево с i узлами. Создать правое поддерево с n-1-i узлами. Объединить все комбинации левого и правого поддеревьев с новым корнем, добавив их в список результатов.
3⃣Вернуть список результатов.
😎 Решение:
using System;
using System.Collections.Generic;
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
this.val = val;
this.left = left;
this.right = right;
}
}
public class Solution {
public IList<TreeNode> AllPossibleFBT(int n) {
if (n % 2 == 0) return new List<TreeNode>();
if (n == 1) return new List<TreeNode> { new TreeNode(0) };
List<TreeNode> result = new List<TreeNode>();
for (int i = 1; i < n; i += 2) {
var leftTrees = AllPossibleFBT(i);
var rightTrees = AllPossibleFBT(n - 1 - i);
foreach (var left in leftTrees) {
foreach (var right in rightTrees) {
TreeNode root = new TreeNode(0, left, right);
result.Add(root);
}
}
}
return result;
}
}
Ставь 👍 и забирай 📚 Базу знаний