Binary Tree Inorder Traversal

https://leetcode.com/problems/binary-tree-inorder-traversal/description/Easy

Условие

Дано корневое дерево. Необходимо вернуть значения его узлов в порядке inorder traversal (левый узел, корневой узел, правый узел).

Примеры

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

Output: [1, 3, 2]

Explanation: Inorder traversal: посещаем левый узел (пусто), корневой узел (1), правый узел (сначала левый узел 3, потом корневой 2). Дерево выглядит так:
    1
     \
      2
     /
    3
Input: root = [1, 2, 3, 4, 5, null, 8, null, null, 6, 7, 9]

Output: [4, 2, 6, 5, 7, 1, 3, 9, 8]

Explanation:
      1
   /     \
  2       3
 / \       \
4   5       8
   / \     /
  6   7   9
Input: root = []

Output: []

Explanation: Пустое дерево.
Input: root = [1]

Output: [1]

Explanation: Дерево с одним узлом.

Решение

/**
 * 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 inorderTraversal(root: TreeNode?): List<Int> {
    val result = mutableListOf<Int>()
    
    // Вспомогательная функция для рекурсивного обхода
    fun traverse(node: TreeNode?) {
        if (node == null) return
        
        // Сначала обходим левое поддерево
        traverse(node.left)
        
        // Посещаем корневой узел
        result.add(node.`val`)
        
        // Затем обходим правое поддерево
        traverse(node.right)
    }
    
    // Запускаем рекурсивный обход с корня
    traverse(root)
    
    return result
}

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

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

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

O(n), из-за хранения всех значений узлов в списке результата и глубины рекурсии, которая в худшем случае может достигать n.