|
| 1 | +# Definition for a binary tree node. |
| 2 | +# |
| 3 | +# defmodule TreeNode do |
| 4 | +# @type t :: %__MODULE__{ |
| 5 | +# val: integer, |
| 6 | +# left: TreeNode.t() | nil, |
| 7 | +# right: TreeNode.t() | nil |
| 8 | +# } |
| 9 | +# defstruct val: 0, left: nil, right: nil |
| 10 | +# end |
| 11 | + |
| 12 | +defmodule Solution do |
| 13 | + @spec invert_tree(root :: TreeNode.t | nil) :: TreeNode.t | nil |
| 14 | + def invert_tree(nil), do: nil |
| 15 | + |
| 16 | + def invert_tree(root) do |
| 17 | + invert(root, root.left, root.right) |
| 18 | + end |
| 19 | + |
| 20 | + defp invert(parent, nil, nil), do: parent |
| 21 | + |
| 22 | + defp invert(parent, left, nil) do |
| 23 | + %TreeNode{parent | left: nil, right: invert(left, left.left, left.right)} |
| 24 | + end |
| 25 | + |
| 26 | + defp invert(parent, nil, right) do |
| 27 | + %TreeNode{parent | left: invert(right, right.left, right.right), right: nil} |
| 28 | + end |
| 29 | + |
| 30 | + defp invert(parent, left, right) do |
| 31 | + tmp = left |
| 32 | + |
| 33 | + %TreeNode{parent | |
| 34 | + left: invert(right, right.left, right.right), |
| 35 | + right: invert(tmp, tmp.left, tmp.right)} |
| 36 | + end |
| 37 | +end |
0 commit comments