-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFlattenBinaryTreeToLinkedList.kt
34 lines (30 loc) · 1.35 KB
/
FlattenBinaryTreeToLinkedList.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package ru.romanow
import ru.romanow.models.TreeNode
/**
* Дано двоичное дерево, требуется развернуть его в связный список:
* * Связанный список должен использовать тот же класс `TreeNode`, где правый дочерний указатель указывает
* на следующий узел в списке, а левый дочерний указатель всегда имеет значение `null`.
* * Обход дерева выполняется в [прямом порядке](https://en.wikipedia.org/wiki/Tree_traversal#Pre-order,_NLR)
*
* [https://leetcode.com/problems/flatten-binary-tree-to-linked-list/](https://leetcode.com/problems/flatten-binary-tree-to-linked-list/)
*/
class FlattenBinaryTreeToLinkedList {
fun flatten(root: TreeNode?) {
flattenSubtree(root)
}
private fun flattenSubtree(node: TreeNode?): TreeNode? {
if (node == null) {
return null
}
val right = node.right
node.right = node.left
node.left = null
val leftSubtree = flattenSubtree(node.right)
if (leftSubtree == null) {
node.right = right
} else {
leftSubtree.right = right
}
return flattenSubtree(right) ?: leftSubtree ?: node
}
}