Symmetric Tree

https://leetcode.com/problems/symmetric-tree/description/Easy

Условие

Дано бинарное дерево, необходимо определить, является ли оно зеркально симметричным относительно своего центра.

Примеры

Input: root = [1, 2, 2, 3, 4, 4, 3]

Output: true
Input: root = [1, 2, 2, null, 3, null, 3]

Output: false

Решение

/**
 * 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 isSymmetric(root: TreeNode?): Boolean {
		// Вложенная функция для проверки зеркальности двух поддеревьев
		fun isMirror(left: TreeNode?, right: TreeNode?): Boolean {
		    // Оба поддерева пустые — симметрично
		    if (left == null && right == null) return true
		    // Если одно из поддеревьев пустое — несимметрично
		    if (left == null || right == null) return false
		    // Проверяем текущие значения узлов и зеркальность поддеревьев
		    return (left.`val` == right.`val`) && isMirror(left.left, right.right) && isMirror(left.right, right.left)
		}
		    
		// Если корня нет, дерево считается симметричным
		return root == null || isMirror(root.left, root.right)
}

Временная сложность

O(n), где n — количество узлов в дереве. Мы проходим по каждому узлу один раз.

Пространственная сложность

O(h), где h — высота дерева, что связано с глубиной рекурсии.