二元搜索树 (binary search tree)
如果你对二元搜索树不太清楚,我们来快速地解释一遍。他的结构是每个节点指向两个其他节点,一个在左边一个在右边。在左边节点的元素会比这个节点的元素要小。在右边的话则比较大。每
个节点最多可以有两棵子树。而我们知道譬如说一棵包含
5
的节点的左子树,里面所有的元素都会小于
5。而节点的右子树里面的元素都会大于
5
。如果我们想找找看
8
是不是在我们的树里面,我们就从
5
那个节点找起,由于
8
比
5 要大,很自然地就会往右搜索。接着我们走到
7
,又由于
8
比
7 要大,所以我们再往右走。我们在三步就找到了我们要的元素。如果这不是棵树而是
List
的话,那就会需要花到七步才能找到
8
。
来定义一棵树的结构
data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show, Read, Eq)
示例:第一个做了一个单节点的树,而第二个插入一个元素到一棵树中。
singleton :: a -> Tree a
singleton x = Node x EmptyTree EmptyTree
treeInsert :: (Ord a) => a -> Tree a -> Tree a
treeInsert x EmptyTree = singleton x
treeInsert x (Node a left right)
| x == a = Node x left right
| x < a = Node a (treeInsert x left) right
| x > a = Node a left (treeInsert x right)
以上为一棵二元搜索树
treeElem :: (Ord a) => a -> Tree a -> Bool
treeElem x EmptyTree = False
treeElem x (Node a left right)
| x == a = True
| x < a = treeElem x left
| x > a = treeElem x right
以上为检测目标是否在二元搜索树中
未理解,未完