如何创建/实现镜像二叉树的算法

时间:2019-02-16 14:23:52

标签: tree binary elixir add

我是Elixir的新手,正在尝试实现插入/添加功能以镜像现有的二叉树。欣赏所有想法。

不知道从哪里开始。

1 个答案:

答案 0 :(得分:1)

我假设您想在Elixir中实现二叉树,并且您也熟悉二叉树。为此,您将需要使用一个结构(这只是幕后的地图)。

defmodule TreeNode do
  defstruct value: nil, left: nil, right: nil 

  def new(value), do: %TreeNode{value: value}

  def insert(root = %TreeNode{value: rootValue}, value) when value < rootValue do
    %{root | left: insert(root.left, value)}
  end

  def insert(root = %TreeNode{value: rootValue}, value) when value >= rootValue do
    %{root | right: insert(root.right, value)}
  end

  def insert(nil, value) do
    %TreeNode{value: value}
  end
end

没有查找方法,这是练习留给您的。用法很简单。在这里,我们创建一个新的树节点,将其作为根:

iex(1)> node = TreeNode.new(10)
%TreeNode{left: nil, right: nil, value: 10}

现在我们将5插入树中

iex(2)> node = TreeNode.insert(node, 5)
%TreeNode{
  left: %TreeNode{left: nil, right: nil, value: 5},
  right: nil,
  value: 10
}

还有12:

iex(3)> node = TreeNode.insert(node, 12)
%TreeNode{
  left: %TreeNode{left: nil, right: nil, value: 5},
  right: %TreeNode{left: nil, right: nil, value: 12},
  value: 10
}

还有11:

iex(4)> node = TreeNode.insert(node, 11)
%TreeNode{
  left: %TreeNode{left: nil, right: nil, value: 5},
  right: %TreeNode{
    left: %TreeNode{left: nil, right: nil, value: 11},
    right: nil,
    value: 12
  },
  value: 10
}

树的最终形状类似于以下内容:

   10
 /    \
5     12
     /
    11

现在镜像变得非常容易。这是实现镜像功能的模块:

defmodule TreeMirror do
  def mirror(nil), do: nil

  def mirror(node) do
    %TreeNode{value: node.value, left: mirror(node.right), right: mirror(node.left)}
  end
end

要镜像我们之前创建的节点,我们只需调用TreeMirror.mirror

iex(5)> mirrored = TreeMirror.mirror node
%TreeNode{
  left: %TreeNode{
    left: nil,
    right: %TreeNode{left: nil, right: nil, value: 11},
    value: 12
  },
  right: %TreeNode{left: nil, right: nil, value: 5},
  value: 10
}

现在mirrored的形状类似于以下内容:

   10
 /    \
12     5
  \
  11