Обход бинарного дерева

Давайте разберем задачу обхода бинарного дерева. Ее можно найти по ссылке
Binary Tree Inorder Traversal

Постановка задачи



Дана Корневая врешина бинарного дерева. Вернуть список всех вершин "по очереди".

Примеры входных данных


프라이머 1



Входные данные:
루트 = [1, 널, 2, 3]
결과:
[1, 3, 2]

예문 2



Входные данные:
루트 = []
결과:
[]

프라이머 3



Входные данные:
루트 = [1]
결과:
[1]

레슈니예



При обходе дерева "по очереди"необходимо сначала посетить левую дочернюю вершину дерева, затем - текущую, а после этого - праверю.

Решение по шаgamm



1) Заводим результирующий список

val res: MutableList<Int> = mutableListOf()


2) Создаем функцию помощник

private fun helper(node: TreeNode?, res: MutableList<Int>) {
    if (node != null) {
        helper(node.left, res)
        res.add(node.`val`)
        helper(node.right, res)
    }
}


В функцию помощник необходимо передавать текущую вершину дерева и список результатов.

3) В функции сначала проверяем на null текущую вершину. Мы делаем рекурсивный вызов функции, а это является терминирующim условием.

4) Далее рекурсивно вызываем функцию helper на левой дочерней вершине.

5) Затем добавляем значение текущей вершины в список результатов.

6) А потом рекурсвивно вызываем функцию helper на правой дочерней вершине.

7) В конце основной функции возвращаем список результатов.

변동 사항



rassmortrim tак же две varиации этой задачи.

선주문



Binary Tree Preorder Traversal

Первая вариация, когда мы добавляем значение вершины в список ответов до обхода дочерних вершин. 4-6.

res.add(node.`val`)
helper(node.left, res)
helper(node.right, res)


4) Добавляем значение текущей вершины в список результатов.

5) Рекурсвивно вызываем функцию helper на левой дочерней вершине.

6) Рекурсвивно вызываем функцию helper на правой дочерней вершине.

후주문



Binary Tree Postorder Traversal

Во второй вариации необходимо добавлять значение вершины в ответ после посещения дочерних вершин. 4-6.

helper(node.left, res)
helper(node.right, res)
res.add(node.`val`)


4) Рекурсвивно вызываем функцию helper на левой дочерней вершине

5) Рекурсвивно вызываем функцию helper на правой дочерней вершине

6) Добавляем значение текущей вершины в список результатов

Оценка сложности


  • По времени - O(n)
  • По памяти - O(n)

  • 폴노예 레쉬니에




    fun inorderTraversal(root: TreeNode?): List<Int> {
        val res: MutableList<Int> = mutableListOf()
        helper(root, res)
        return res
    }
    
    private fun helper(node: TreeNode?, res: MutableList<Int>) {
        if (node != null) {
            helper(node.left, res)
            res.add(node.`val`)
            helper(node.right, res)
        }
    }
    

    좋은 웹페이지 즐겨찾기