【问题标题】:Adding a leaf to Binary Search Tree, Haskell向二叉搜索树添加叶子,Haskell
【发布时间】:2012-03-10 00:59:06
【问题描述】:

类型定义为

data BST = MakeNode BST String BST
          | Empty

我正在尝试向树中添加新叶子,但我真的不明白如何使用递归来实现。

函数是这样设置的

add :: String -> BST -> BST

【问题讨论】:

  • 您对BST 的定义无效。我想你的意思是data BST = MakeNode String BST BST | Empty,对吧?
  • 是的,这是一个错字。谢谢

标签: haskell binary-tree


【解决方案1】:

使用二叉树的好处是你只需要查看树的“当前部分”就知道在哪里插入节点。

那么,让我们定义add 函数:

add :: String -> BST -> BST

如果你在一个空树中插入一些东西(案例#1),你只需直接创建一个叶子:

add s Empty = MakeNode Empty s Empty

如果你想在一个节点中插入一些东西(案例#2),你必须决定在哪个子节点中插入值。你使用比较来做这个测试:

add s t@(MakeNode l p r) -- left, pivot, right
  | s > p     = Node l p (add s r) -- Insert into right subtree
  | s < p     = Node (add s l) p r -- Insert into left subtree
  | otherwise = t -- The tree already contains the value, so just return it

请注意,这不会重新平衡二叉树。二叉树再平衡算法可能非常复杂,需要大量代码。所以,如果你在二叉树中插入一个排序列表(例如["a", "b", "c", "d"]),它会变得非常不平衡,但这种情况在实践中非常少见。

【讨论】:

  • @dflemstr 你能快速解释一下@符号吗?
  • @ 符号为其右侧的整个模式创建了一个名称。所以,如果我做t @ (MakeNode l p r),就像在后面的代码中说let t = MakeNode l p r in,只是程序不会创建新的MakeNode;它只会重用旧的。
  • 好的,这样就可以了,所以您可以通过使用 t 来使用整个 BST,并通过使用 (MakeNode l p r) 来使用模式,基本上?
  • 是的,你可以这样描述它。
  • 好的,非常感谢。昨天我试图做类似的事情,我不知道怎么做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
相关资源
最近更新 更多