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

Решение

class Solution {
    fun postorderTraversal(root: TreeNode?): List<Int> {
        val res = ArrayList<Int>()
        val dummy = TreeNode(0)
        dummy.left = root
        var cur: TreeNode? = dummy
        fun reverse(from: TreeNode, to: TreeNode) {
            var a: TreeNode? = from
            var b: TreeNode? = from.right
            while (a !== to) {
                val c = b!!.right
                b.right = a
                a = b
                b = c
            }
        }
        fun visit(from: TreeNode, to: TreeNode) {
            reverse(from, to)
            var p: TreeNode? = to
            while (true) {
                res.add(p!!.`val`)
                if (p === from) break
                p = p.right
            }
            reverse(to, from)
        }
        while (cur != null) {
            val left = cur.left
            if (left == null) {
                cur = cur.right
            } else {
                var pre = left
                while (pre.right != null && pre.right !== cur) pre = pre.right
                if (pre.right == null) {
                    pre.right = cur
                    cur = cur.left
                } else {
                    visit(left, pre)
                    pre.right = null
                    cur = cur.right
                }
            }
        }
        return res
    }
}