Решение
/**
* Example:
* var ti = TreeNode(5)
* var v = ti.`val`
* Definition for a binary tree node.
* class TreeNode(var `val`: Int) {
* var left: TreeNode? = null
* var right: TreeNode? = null
* }
*/
fun isSubtree(root: TreeNode?, subRoot: TreeNode?): Boolean {
// Локальная вспомогательная функция для проверки совпадения двух деревьев
fun isSameTree(p: TreeNode?, q: TreeNode?): Boolean {
// Если оба дерева пустые, они совпадают
if (p == null && q == null) return true
// Если одно из деревьев пустое, а другое нет, они не совпадают
if (p == null || q == null) return false
// Если значения текущих узлов не совпадают, деревья не совпадают
if (p.`val` != q.`val`) return false
// Проверяем совпадение левых и правых поддеревьев
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right)
}
// Если поддерево пустое, то оно является поддеревом любого дерева
if (subRoot == null) return true
// Если дерево пустое, то поддерева быть не может
if (root == null) return false
// Проверяем, совпадают ли текущие деревья
if (isSameTree(root, subRoot)) return true
// Рекурсивно проверяем левое и правое поддеревья
return isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot)
}