Types Fsharp F中递归遍历二叉树的三种方法#

Types Fsharp F中递归遍历二叉树的三种方法#,types,tree,f#,Types,Tree,F#,我一直在读这本伟大的书使用F#函数编程,我刚读到关于有限树的一章,我注意到有三种遍历树的方法,但我不明白它们为什么不同以及如何不同。 这是代码 type BinaryTree<'a> = |Leaf |Node of BinaryTree<'a> * 'a * BinaryTree<'a> let rec preorder (tr:BinaryTree<'a>) : 'a list = match tr with

我一直在读这本伟大的书使用F#函数编程,我刚读到关于有限树的一章,我注意到有三种遍历树的方法,但我不明白它们为什么不同以及如何不同。 这是代码

type BinaryTree<'a> =
    |Leaf 
    |Node of BinaryTree<'a> * 'a * BinaryTree<'a>


let rec preorder (tr:BinaryTree<'a>) : 'a list =
    match tr with
    |Leaf            -> []
    |Node(trr,x,trl) -> x:: (preorder trr) @ (preorder trl) 


let rec inorder (tree:BinaryTree<'a>) : 'a list =
    match tree with
    |Leaf -> []
    |Node(tr,x,tl) -> (inorder tr) @ [x] @ (inorder tl)

let rec postorder (tree:BinaryTree<'a>) : 'a list =
    match tree with
    |Leaf -> []
    |Node(tr,x,tl) -> (postorder tr) @ (postorder tl) @ [x]

let someTree = Node(Leaf,20,Node(Leaf,40,Node(Node(Leaf,-2,Leaf),2,Node(Leaf,0,Leaf))))

preorder someTree
inorder someTree
postorder someTree
键入BinaryTree*'a*BinaryTree:'a列表=
匹配
|叶->[]
|节点(trr,x,trl)->x::(预订单trr)@(预订单trl)
let rec inorder(树:BinaryTree[]
|节点(tr,x,tl)->(顺序tr)@[x]@(顺序tl)
let rec postorder(树:BinaryTree[]
|节点(tr,x,tl)->(后序tr)@(后序tl)@[x]
让someTree=Node(叶,20,节点(叶,40,节点(叶,-2,叶),2,节点(叶,0,叶)))
预订某棵树
为了某棵树
后序树

欢迎提供任何帮助!:)

如果您运行自己的代码,您将看到结果的不同:

> preorder someTree;;
val it : int list = [20; 40; 2; -2; 0]
> inorder someTree;;
val it : int list = [20; 40; -2; 2; 0]
> postorder someTree;;
val it : int list = [-2; 0; 2; 40; 20]

因此,区别在于列表元素的顺序。

看看不同遍历方法中的连接顺序:

预订单:
x::(预订单tl)@(预订单tr)

  • x
    :当前值
  • 预订单tl
    :访问左树
  • 预订单tr
    :访问右树
  • 在:
    (顺序tl)@[x]@(顺序tr)

  • 顺序tl
    :访问左树
  • x
    :当前值
  • 顺序tr
    :访问右树
  • Post:
    (邮购tl)@(邮购tr)@[x]

  • postorder tl
    :访问左树
  • postorder tr
    :访问右树
  • x
    :当前值
  • 如果从树的顶部(根上方)开始逆时针追踪树:

    • Pre-order遍历按首先遇到每个节点左侧的顺序返回元素
    • 按顺序遍历按首先遇到每个节点底部的顺序返回元素
    • Post-order遍历按首先遇到每个节点右侧的顺序返回元素
    作为一个简要概述,预顺序遍历对于复制整个树非常有用,顺序遍历对于二进制搜索非常有用,而后顺序遍历对于删除整个树非常有用


    更多细节可以在这里找到:

    如果这本书真的很棒,书中会详细解释这一点,并提供一些激励性的例子。区别在于收集节点的顺序。(如果您不知道,“pre”表示“之前”,而“post”表示“之后”。)#molbdnilo,lol…我在英语世界里说法语,不管怎么说,它详细地谈论了它们,但它没有说为什么我应该使用一个而不使用另一个…这是我的问题。如果它不够清楚。它不是上帝或坏,它解决了不同的任务:你可能需要不同的顺序,这取决于你对结果的处理这是一个很好的崩溃