我必须创建一个二叉搜索树,一个名为Person的数据类型,并基本上在树中插入每个人。问题是插入方法有一个优先级类型,它在下面的代码中定义:
class Priorities a where
priority :: a -> Int
instance Priorities a where
priority :: a -> Int
树的每个节点都是一个列表,插入是关于优先级的优先级编号,每个人都给出了(在我的代码中,这个函数叫做insertTree)。
这是我到目前为止所做的事情:
data Tree => Tree a = EmptyTree
| Node a (Tree [a]) (Tree [a]) deriving (Show, Read, Eq)
data Person = Person { name :: a
, age :: a
, handicapped :: a
} deriving (Eq)
这是我需要帮助的地方,因为我不知道如何进行此插入。我的意思是,我开始行,但是当我到达需要使用优先级值的部分以便知道在哪个节点(这是一个列表)时,我会感到困惑,我将插入数据。 / p>
insertTree :: (Ord a) => Priorities priority -> Tree a -> a -> Tree a
insertTree x EmptyTree x = Node x EmptyTree EmptyTree
insertTree x (Node a left right) y
|x == = Node y left right
|x
我想问你的另一件事是,我如何才能使数据类型People成为Priorities类的一个实例。
答案 0 :(得分:1)
如果我理解你的问题,你的树型应该是这样的:
data Tree a = EmptyTree
| Node {
nodePriority:: Int,
nodeValues :: [a],
leftChild :: Tree a,
rightChild :: Tree a
} deriving (Show, Read, Eq)
然后insertTree就像:
...
insertTree value (Node p values left right) =
| priority value == p = "insert value in values"
| priority value < p = "recurse into left branch"
| otherwise = "recurse into right branch"
这个想法是左分支中的节点总是优先于它的父节点,而右边的节点总是等于或大于它的父节点。例如,如果按以下顺序插入,优先级为4 2 5 1 3的对象将生成以下树:
4
/ \
2 5
/ \
1 3
最后,要使Person成为优先级的实例,您可以执行以下操作:
instance Priorities Person where
priority p = age p -- I'm using age as an example, but you can put whatever function you want
答案 1 :(得分:0)
所以基本上我的insertTree函数会是这样的:
insertTree value (Node p left values right)
| priority value == p = Node p left value right
| priority value < p = Node p left value (insertTree right value)
| otherwise = Node p (insertTree left value) value right