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