Functional programming 函数式编程二叉搜索树作业

Functional programming 函数式编程二叉搜索树作业,functional-programming,context-free-language,Functional Programming,Context Free Language,因此,我必须为二叉树编写一个插入函数,使其成为二叉搜索树,但我遇到了一些麻烦。一切都是函数,所以我知道没有状态的概念。因此,在插入时,我需要反复递归地创建树。我很难接受这个想法 treenode -> procedure(val, left, right) procedure(some) if some then -(some, 1) then right else left else val 这允许我创建节点并访问值、左子树和右子树(0表示空树): 要创建更复杂的树,我可以执行以下操作

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

treenode -> procedure(val, left, right) procedure(some) if some then -(some, 1) then right else left else val
这允许我创建节点并访问值、左子树和右子树(0表示空树):

要创建更复杂的树,我可以执行以下操作:

.treenode(4, .treenode(3, 0, 0), .treenode(6, .treenode(2, 0, 0), 0))
我甚至可以在一棵空树上插入:

.treenode(4, 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

我以前从未见过这种语法,所以如果我把一些语法弄错了,请耐心听我说。希望代码能说明需要做什么-

  • 如果树为空,则没有要比较的值,请使用该值创建一个单例节点。这是您已经完成的部分
  • 否则,树不是空的,因此我们有一个值来比较。如果要插入的值小于根的值,请创建一个由根的值组成的新节点,将值插入根的左分支,并保持根的右分支不变
  • 如果该值大于根的值,请执行上述操作,但将新值插入根的右分支,而不是左分支
  • 该值既不小于也不大于根的值,因此它等于根的值,并且没有要插入的内容。在这种情况下,返回未修改的根目录
  • 项目符号对应于下面的编号注释-

    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
    
    insert->procedure(根,值)
    如果为空(根),则#1
    .treenode(值,0,0)
    如果值root.value#3,则为else
    .treenode(root.value,root.left,插入(root.right,value))
    其他#4
    根
    
    StackOverflow允许我们直接在应答帖子中运行JavaScript片段。这里有一个功能片段,可以让您看到这个概念的实际应用-

    常量为空=
    {}
    常量树节点=(值,左=空,右=空)=>
    ({值,左,右})
    常量插入=(t,值)=>
    t==空
    ? treenode(值,空,空)
    :值t值
    ? 树节点(t值,t左,插入(t右,值))
    :t
    常量print=(t,pre='',child='')=>
    t==空
    ? 前+'∅\不
    :打印
    (t.对
    ,child+'┌── '
    ,child+“。”
    )
    +前置+字符串(t.value)+'\n'
    +印刷品
    (t.左
    ,child+'└── '
    ,child+“。”
    )
    让树=空
    树=插入(树,4)
    树=插入(树,6)
    树=插入(树,9)
    树=插入(树,3)
    树=插入(树,5)
    树=插入(树,1)
    
    console.log(print(tree))
    一旦您了解了需要执行的操作,请使用您的过程的有效语法编辑此答案。如果您还有其他问题,请告诉我。您所说的有道理,但我认为它行不通。我需要返回一个添加了新节点的整个树的副本,所以当我试图从树中获取信息时,我也在递归地再次构建它。在您给我的基本情况下,它只返回一个带有新值的treenode,但是我需要将整个树与新值一起返回node@SomeGuy我已经包含了一个功能代码片段,以演示insert确实返回整个树,而不仅仅是新插入的节点。这是什么语言?还有,这个问题和CFLs有什么关系?@Bergi这是我们在课堂上创建的一种语言