Сложность: medium
Дан корень бинарного дерева. Верните true, если можно разделить дерево на два дерева с равными суммами значений после удаления ровно одного ребра из исходного дерева.
Пример:
Input: root = [5,10,10,null,null,2,3]
Output: true
👨💻 Алгоритм:
1⃣Вычисление общей суммы:
Напишите функцию для вычисления общей суммы всех узлов дерева.
2⃣Проверка возможности разделения:
Напишите функцию, чтобы рекурсивно проверить, может ли поддерево быть равно половине общей суммы. Если такое поддерево найдено, значит дерево можно разделить на две части с равными суммами.
3⃣Валидация и возврат результата:
Проверьте, что общая сумма четная (так как только в этом случае возможно её разделение на две равные части), и используйте функцию проверки поддерева, чтобы определить, можно ли разделить дерево на две части с равными суммами.
😎 Решение:
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Solution {
public boolean checkEqualTree(TreeNode root) {
int totalSum = sumTree(root);
if (totalSum % 2 != 0) return false;
int target = totalSum / 2;
return checkSubtreeSum(root, target, root);
}
private int sumTree(TreeNode node) {
if (node == null) return 0;
return node.val + sumTree(node.left) + sumTree(node.right);
}
private boolean checkSubtreeSum(TreeNode node, int target, TreeNode root) {
if (node == null) return false;
if (node != root && sumTree(node) == target) {
return true;
}
return checkSubtreeSum(node.left, target, root) || checkSubtreeSum(node.right, target, root);
}
}Ставь 👍 и забирай 📚 Базу знаний