在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