【问题标题】:Standard ML Binary Tree Traversal标准 ML 二叉树遍历
【发布时间】:2016-09-03 18:24:30
【问题描述】:

我是 SML 的新手,正在练习树遍历。 这是问题的设置。

datatype 'a bTree = nil | bt of 'a bTree * 'a * 'a bTree;

我需要编写一个接受二叉树的函数 inorder 并在中序遍历中返回树中所有成员的列表。

我写了这行:

fun inorder(nil) = nil
  | inorder(bt(left,key,right)) = inorder(left) @ [key] @ inorder(right);

但遇到一些错误,不知道如何解决:

Error: operator and operand don't agree [tycon mismatch]
operator domain: 'Z list * 'Z list
operand:         'Z list * 'Y bTree
in expression:
  (key :: nil) @ inorder right

Error: operator and operand don't agree [tycon mismatch]
operator domain: 'Z list * 'Z list
operand:         'Y bTree * _
in expression:
  inorder left @ (key :: nil) @ inorder right

【问题讨论】:

    标签: binary-tree sml ml tree-traversal


    【解决方案1】:

    您无意中隐藏了 nil 列表构造函数,并将其替换为同名的树构造函数。

    这意味着你的第一个案例,

    inorder(nil) = nil
    

    表示inorder 的结果是一棵树;它的类型是

    'a bTree -> 'a bTree
    

    并且您不能将 (@) 列表附加到 'a bTree

    如果您重命名空树构造函数,您的代码将起作用:

    datatype 'a bTree = nilTree | bt of 'a bTree * 'a * 'a bTree;
    
    fun inorder nilTree = nil
      | inorder (bt(left,key,right)) = inorder left @ [key] @ inorder right;
    

    或使用[] 代替nil
    不过,不隐藏nil 是更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2012-01-01
      • 2022-11-11
      • 1970-01-01
      • 2021-11-20
      相关资源
      最近更新 更多