Data structures 验证树是否为二叉树

Data structures 验证树是否为二叉树,data-structures,functional-programming,ocaml,Data Structures,Functional Programming,Ocaml,我认为一棵树要成为二叉树,它必须满足一棵r节点的树有r个子树的要求。 我将节点定义为秩、元素和二叉树列表的元组 我不知道如何检查一棵树是否是二叉树。我所能想到的就是制作一个递归函数,实现: 如果一个等级为0的树和一个空列表,那么它确实是一个二叉树 如果是秩r的树,那么我需要检查我的树是否由秩r-1,r-2,…,0的其他树组成。我走对了吗?我被困在这一点上。 以下是我到目前为止得到的信息: let valid_rank (Tree : tree) : bool = let curr_ra

我认为一棵树要成为二叉树,它必须满足一棵r节点的树有r个子树的要求。 我将节点定义为秩、元素和二叉树列表的元组

我不知道如何检查一棵树是否是二叉树。我所能想到的就是制作一个递归函数,实现:

  • 如果一个等级为0的树和一个空列表,那么它确实是一个二叉树
  • 如果是秩r的树,那么我需要检查我的树是否由秩r-1,r-2,…,0的其他树组成。我走对了吗?我被困在这一点上。 以下是我到目前为止得到的信息:

     let valid_rank (Tree : tree) : bool = 
       let curr_rank = (rank Tree) in
         let rec helper t counter =
           match t with
            |Node(r,x,c) -> (if  r <> (curr_rank - counter) then false
                            else (match c with
                                    |[] -> true
                                    |t1::ts -> helper t1 (counter + 1)))
                             in helper Tree 0
    
     let verify_Bintree (t : tree) : bool = 
       (valid_rank t) 
    
    let valid_rank(Tree:Tree):bool=
    让curr_秩=(秩树)在
    让rec helper t计数器=
    匹配
    |节点(r,x,c)->(如果r(curr_秩-计数器),则为false
    else(将c与
    |[]->正确
    |t1::ts->helper t1(计数器+1)))
    在助手树0中
    让我们验证\u Bintree(t:tree):bool=
    (有效等级t)
    
    这里我的观点是,在我的valid_rank函数中,当我在末尾“match c with…”时,我递归地调用t1上的helper,而不是列表ts的其余部分,因为helper接受的是树,而不是树列表。我不确定这是否有效

  • 我在这里的目的是,对于一棵树,比如说等级3,我想知道它是否有所有等级为2,1,0的子树。如果是,那么它是一棵二叉树

    你认为我的有效排名函数有缺陷吗?如果是这样,我如何修复我的算法?
    谢谢。

    rang N的二叉树是一个包含N个范围为N-1、N-2、…、0的子项的树,每个子项都是二叉树。你在正确的轨道上,但有点偏离了轨道

    助手应检查
    c
    的每个元素是否具有预期的范围,并且是有效的二叉树(递归到主函数)。所以助手应该是这样的

    let Node(curr_rank, x, c) = tree in
    let rec helper counter = function
       | [] -> counter = -1
       | n::ns -> if counter = rank n
                  then if valid_rank n
                       then helper (counter - 1) ns
                       else false
                  else false
    in helper (curr_rank - 1) c
    

    如果您不确定是什么定义了二叉树,请确保在尝试编写检查树是否为二叉树的函数之前理解它。到目前为止你有什么代码?什么是二叉树?这不是一个标准的术语,当你使用它的方式,你似乎正在使用它。你是说“二叉树”吗?在进一步讨论之前,你肯定想知道什么是二叉树:-)我在冈崎的第21页看到了一个定义,“纯功能数据结构”。秩为0的二叉树是单个节点。秩(r+1)二叉树由两个秩为r的二叉树组成,两个二叉树相互连接,其中一个是另一个的最左边的子树。可能这就是您要处理的。@eclecticist我不想公开发布我的代码,但目前我所拥有的(只是想法)是,我需要帮助函数来检查列组是否按顺序排列,是否所有列组都存在,以及是否遵守min heap属性。我还处于这个问题的早期阶段。@AdamRalphus“我不想公开发布我的代码”那么,我们不能帮助你,是吗?