То, как вы это делаете, заключается в том, что вы перебираете список и дерево одновременно.Это означает, что ваш код может работать, только если числа появляются в дереве в том же порядке, в котором они появляются в списке элементов, которые нужно удалить.
Если это то, что вы на самом деле хотите, вы можете добавить один случай в вашу функцию, чтобы она заработала:
let rec remove (p :string list) (tree: Tree) :Tree =
match p, tree with
| a::b, y ->
match y with
| Leaf(n) when a = n -> Leaf("")
| Branch[(x, p)] when a = x -> Branch[("", remove b p)]
| Branch[(x, p)] -> Branch[(x, remove (a::b) p)] // Added this line!
| _ -> remove b y
| [], y -> tree
Добавленная строка обрабатывает случай, когда вы обнаружите ветвь счисло не в начале списка - поэтому мы сохраняем ветвь как есть и продолжаем удалять числа из поддерева.
Тем не менее, я думаю, что вы, вероятно, хотите удалить узлы независимо от порядкаэлементы в списке.Вы можете сделать это, используя что-то вроде List.contains
, чтобы проверить, должна ли быть удалена ветвь:
let rec remove (p :string list) (tree: Tree) :Tree =
match tree with
| Leaf(n) when List.contains n p -> Leaf("")
| Branch[(x, sub)] when List.contains x p -> Branch[("", remove p sub)]
| Branch[(x, sub)] -> Branch[(x, remove p sub)]
Обратите внимание, что в этом коде все еще отсутствует случай для ветки с несколькими поддеревьями, так что это что-товам нужно добавить, но, надеюсь, пример укажет вам правильное направление!