函数式编程二进制搜索树作业

时间:2019-03-19 04:00:01

标签: functional-programming context-free-language

因此,我必须为二叉树编写一个插入函数以使其成为二叉搜索树,但是我遇到了一些麻烦。一切都是功能,所以我知道没有状态的概念。因此,在插入时,我需要一遍又一遍地递归地创建树。我在围绕这个想法时遇到了麻烦。

treenode -> procedure(val, left, right) procedure(some) if some then -(some, 1) then right else left else val

这使我可以创建节点并访问值,像这样(左代表一棵空树),左子树和右子树:

.treenode(4, 0, 0)

要创建更复杂的树,我可以这样做:

.treenode(4, .treenode(3, 0, 0), .treenode(6, .treenode(2, 0, 0), 0))

我已经插入到一棵空树上了。

insert -> procedure(root, value) if empty(root) then .treenode(value, 0, 0) else insert_recursive(root, .treenode(value, 0, 0)

在这里我无法弄清楚如何插入到这样的树中。用这种语言没有状态的概念,因此我需要以某种方式将带有值的新节点递归地附加到当前树上。如果有人可以给我一个提示,我将不胜感激。我应该这样称呼它:

tree = empty
tree = insert(tree, 4)
tree = insert(tree, 6)
....
and so on

1 个答案:

答案 0 :(得分:2)

我以前从未见过这种语法,所以如果我语法错误,请多多包涵。希望代码演示了需要做的事情-

  1. 如果树为空,则没有可比较的值,请使用该值创建一个单例节点。这是您已经完成的部分。
  2. 否则,树不是为空,因此我们有一个要比较的值。如果要插入的值小于根的值,则创建一个由根的值组成的新节点,将值插入根的左分支,并保持根的右分支不变。
  3. 如果该值大于根的值,请执行与上述相同的操作,但是将新值插入根的 right 分支中,而不是 left
  4. 该值既不小于也不大于根的值,因此它等于根的值,并且没有可插入的内容。在这种情况下,返回未修改的根

项目符号要点对应于以下编号的注释-

insert -> procedure(root, value)
  if empty(root) then           #1
    .treenode(value, 0, 0)
  else if value < root.value    #2 
    .treenode (root.value, insert(root.left, value), root.right)
  else if value > root.value    #3
    .treenode (root.value, root.left, insert(root.right, value))
  else                          #4
    root

StackOverflow允许我们直接在答案文章中运行JavaScript代码段。这是一个可正常运行的代码段,可让您实际了解这一概念-

const empty =
  {}

const treenode = (value, left = empty, right = empty) =>
  ({ value, left, right })

const insert = (t, value) =>
  t === empty
    ? treenode (value, empty, empty)
: value < t.value
    ? treenode (t.value, insert (t.left, value), t.right)
: value > t.value
    ? treenode (t.value, t.left, insert (t.right, value))
: t

const print = (t, pre = '', child = '') =>
  t === empty
    ? pre + '∅\n'
    : print
        ( t.right
        , child + '┌── '
        , child + '.   '
        )
    + pre + String (t.value) + '\n'
    + print
       ( t.left
       , child + '└── '
       , child + '.   '
       )

let tree = empty
tree = insert (tree, 4)
tree = insert (tree, 6)
tree = insert (tree, 9)
tree = insert (tree, 3)
tree = insert (tree, 5)
tree = insert (tree, 1)

console.log (print (tree))

程序将打印构造的tree符号表示-

.   .   .   ┌── ∅
.   .   ┌── 11
.   .   .   └── ∅
.   ┌── 9
.   .   └── ∅
┌── 6
.   .   ┌── ∅
.   └── 5
.   .   └── ∅
4
.   ┌── ∅
└── 3
.   .   ┌── ∅
.   └── 1
.   .   └── ∅