在Haskell中使用树作为优先级队列

时间:2013-11-13 22:41:23

标签: haskell queue binary-search-tree typeclass

我必须创建一个二叉搜索树,一个名为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类的一个实例。

2 个答案:

答案 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