在Haskell中检索平衡二叉树的元素
假设我有以下形式的自定义树数据类型:在Haskell中检索平衡二叉树的元素,haskell,tree,indexing,Haskell,Tree,Indexing,假设我有以下形式的自定义树数据类型: data BalTree a = Leaf | Node Integer (BalTree a) a (BalTree a) deriving (Eq, Show, Read) 创建一棵大小为10的新树,我将得到以下结果: Node 10 (Node 5 (Node 2 (Node 1 Leaf 'Z' Leaf) 'Z' Leaf) 'Z' (Node 2 (Node 1 Leaf 'Z'
data BalTree a = Leaf | Node Integer (BalTree a) a (BalTree a) deriving (Eq, Show, Read)
创建一棵大小为10的新树,我将得到以下结果:
Node 10 (Node 5 (Node 2 (Node 1 Leaf 'Z' Leaf) 'Z' Leaf)
'Z'
(Node 2 (Node 1 Leaf 'Z' Leaf) 'Z' Leaf))
'Z'
(Node 4 (Node 2 (Node 1 Leaf 'Z' Leaf) 'Z' Leaf)
'Z'
(Node 1 Leaf 'Z' Leaf))
当给定索引时,如何按横向顺序检索元素
我的尝试:
ind Leaf pos = Nothing
ind tree@(Node n lt x rt) pos
| pos < 0 = Nothing
| pos > treeSize-1 = Nothing
| pos < hTreeSize = ind lt pos
| pos == hTreeSize = Just x
| pos > hTreeSize = ind rt (pos - hTreeSize)
where treeSize = size tree
hTreeSize = treeSize `div` 2
ind Leaf pos=无
索引树@(节点n lt x rt)位置
|pos<0=无
|pos>treeSize-1=无
|poshTreeSize=ind-rt(pos-hTreeSize)
其中treeSize=树的大小
hTreeSize=treeSize`div`2
我不确定这是否是顺序横向的,并且它没有返回正确的结果。我们希望在顺序遍历中获得存储在二叉树中的第n个值。我们知道以每个节点为根的每个树中存储的值的数量(节点的
整数参数)
如果B
保持n-1
值,则n
th值是A
的值。如果B
包含的值大于或等于n
值,那么我们可以忽略树的其余部分,只搜索B
;所以我们只是重复到它。否则,我们应该在C
中查找值,因此我们递归到它中;在这种情况下,我们还需要更新n
,以反映B
中有一些值,而A
中有1个值
在最坏的情况下,该算法向下移动到叶
,因此复杂性为O(树的深度)
。如果树是平衡的,那么复杂性是O(log2(树的大小))
您的尝试有什么问题吗?顺便说一句,Haskell中的具体类型名称(与变量相反)必须大写。所以,BalTree
不是BalTree
。对不起,伙计们!我试图检索给定索引处的元素,而不是第一个元素。戴夫:我有一种感觉,我根本没有按顺序进行横截,它不会返回正确的结果。卢基:对不起,这是个打字错误。很抱歉。当我得到一个索引时,我试图检索一些随机元素。对不起,打错了。
data BalTree a = Leaf
| Node Integer (BalTree a) a (BalTree a)
size :: BalTree a -> Integer
size Leaf = 0
size (Node size _ _ _) = size
nthInOrder :: BalTree a -> Integer -> Maybe a
nthInOrder Leaf _ =
Nothing
nthInOrder (Node _ left x right) n
| leftSize == n - 1 = Just x
| n <= leftSize = nthInOrder left n
| otherwise = nthInOrder right (n - leftSize - 1)
where
leftSize = size left
A
/ \
B C