【发布时间】:2012-03-26 10:28:01
【问题描述】:
我正在制作一个 Haskell 函数来从二叉搜索树中删除一个节点。 我知道关于需要采取的行动的规则,具体取决于孩子的数量 目标父母有。
没有孩子 - 删除, 1 个孩子 - 替换为孩子, 2 个孩子 - 在右子树中找到最小值并将节点替换为该值, - 然后,递归删除右子树中的最小值
data BST = MakeNode BST String BST
| Empty
deleteNode :: String -> BST
treeBuilder :: [String] -> BST
treeBuilder = foldr add Empty
add :: String -> BST -> BST
add new Empty = (MakeNode Empty new Empty)
add string tree@(MakeNode left value right)
| string > value = MakeNode left value (add string right)
| string < value = MakeNode (add string left) value right
| otherwise = tree
无法弄清楚为什么 treeBuilder 也不能正常工作。它只是在对角线上向右打印字符串。
【问题讨论】:
-
到目前为止你有什么代码?你的特殊问题在哪里?很多 BST 问题闻起来很像家庭作业,所以我不敢回答。 (并不是说我们根本不回答作业问题,而是应该以不同的方式回答它们以帮助学习。)
-
我真的不知道从哪里开始。
-
从最简单的情况开始:
deleteNode x Empty = ...什么会代替 ...,即从空树中删除任何内容会产生什么结果? -
如果你现在所在的节点是空的,你不想删除前一个节点吗?
-
不。如果您到达空节点,则意味着您从未找到要删除的节点。想象一下你有树 [1, 0, 2] 你说“删除 3 棵树”。你会到达 2 右侧的“Empty”,但这是否意味着你应该删除 2?
标签: haskell binary-tree