diff --git "a/\354\236\241\353\266\200/17\354\243\274\354\260\250/\354\235\264\354\247\204\352\262\200\354\203\211\355\212\270\353\246\254.md" "b/\354\236\241\353\266\200/17\354\243\274\354\260\250/\354\235\264\354\247\204\352\262\200\354\203\211\355\212\270\353\246\254.md" new file mode 100644 index 0000000..b8d7339 --- /dev/null +++ "b/\354\236\241\353\266\200/17\354\243\274\354\260\250/\354\235\264\354\247\204\352\262\200\354\203\211\355\212\270\353\246\254.md" @@ -0,0 +1,38 @@ +```Kotlin +import java.io.BufferedReader +import java.io.InputStreamReader + +fun main() { + val br = BufferedReader(InputStreamReader(System.`in`)) + val nodes = mutableListOf() + + while (true) { + val input = br.readLine() ?: break + nodes.add(input.toInt()) + } + + postOrder(nodes, 0, nodes.size - 1) +} + +fun postOrder(nodes: List, start: Int, end: Int) { + if (start > end) return + + val root = nodes[start] + var rightStart = end + 1 + + for (i in start + 1..end) { + if (nodes[i] > root) { + rightStart = i + break + } + } + + postOrder(nodes, start + 1, rightStart - 1) // 왼쪽 서브트리 + postOrder(nodes, rightStart, end) // 오른쪽 서브트리 + println(root) // 루트 출력 +} +``` + +현재 값보다 큰 값을 찾는다. + +큰 값을 기준으로 Left / Right 가 나눠지기 때문이다. diff --git "a/\354\236\241\353\266\200/17\354\243\274\354\260\250/\354\235\264\354\247\204\355\212\270\353\246\254\354\235\230\354\247\201\352\262\275.md" "b/\354\236\241\353\266\200/17\354\243\274\354\260\250/\354\235\264\354\247\204\355\212\270\353\246\254\354\235\230\354\247\201\352\262\275.md" new file mode 100644 index 0000000..e4d4366 --- /dev/null +++ "b/\354\236\241\353\266\200/17\354\243\274\354\260\250/\354\235\264\354\247\204\355\212\270\353\246\254\354\235\230\354\247\201\352\262\275.md" @@ -0,0 +1,27 @@ +```Kotlin +import utils.TreeNode +import kotlin.math.max + +class DiameterOfBinaryTree { + private var longest:Int = 0 + + private fun dfs(root: TreeNode?): Int { + if (root == null) { + return -1 + } + + val left = dfs(root.left) + val right = dfs(root.right) + + longest = max(longest, left + right + 2) + return max(right, left) + 1 + } + + fun diameterOfBinaryTree(root: TreeNode?): Int { + dfs(root) + return longest + } +} +``` + +leaf 노드로부터 leaf 노드가 가질 수 있는 최고의 길이를 구하여 활용할 수 있도록 한다. diff --git "a/\354\236\241\353\266\200/17\354\243\274\354\260\250/\354\235\264\354\247\204\355\212\270\353\246\254\354\235\230\354\265\234\353\214\200\352\271\212\354\235\264.md" "b/\354\236\241\353\266\200/17\354\243\274\354\260\250/\354\235\264\354\247\204\355\212\270\353\246\254\354\235\230\354\265\234\353\214\200\352\271\212\354\235\264.md" new file mode 100644 index 0000000..6de5087 --- /dev/null +++ "b/\354\236\241\353\266\200/17\354\243\274\354\260\250/\354\235\264\354\247\204\355\212\270\353\246\254\354\235\230\354\265\234\353\214\200\352\271\212\354\235\264.md" @@ -0,0 +1,25 @@ +```Kotlin +class MaximumDepthOfBinaryTree { + fun recv(root: TreeNode?, depth: Int): Int { + if (root == null) return depth + + var currentDepth = depth; + if (root.left != null) { + currentDepth = max(recv(root.left, depth+1), currentDepth) + } + + if (root.right != null) { + currentDepth = max(recv(root.right, depth+1), currentDepth) + } + + return currentDepth + } + + fun maxDepth(root: TreeNode?): Int { + if (root == null) return 0 + return recv(root, 1); + } +} +``` + +재귀를 통해서, 가장 깊이 들어갈 수 있는 값을 구한다. \ No newline at end of file