Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 在Haskell中测试二叉树是否平衡_Function_Haskell_Tree_Binary Tree - Fatal编程技术网

Function 在Haskell中测试二叉树是否平衡

Function 在Haskell中测试二叉树是否平衡,function,haskell,tree,binary-tree,Function,Haskell,Tree,Binary Tree,除了递归调用左、右子树上的size函数外,测试二叉树是否平衡的另一种方法是什么。abs(size left-size right)这取决于二叉树在Haskell中的表示方式。如果是递归数据结构,递归是唯一的武器…这取决于二叉树在Haskell中的表示方式。如果是递归数据结构,递归是你唯一的武器…所以递归很容易,不是吗 import Data.Maybe (isJust) getBalancedSize :: (Monad m, Num b, Ord b) => BinaryTree a

除了递归调用左、右子树上的size函数外,测试二叉树是否平衡的另一种方法是什么。abs(size left-size right)这取决于二叉树在Haskell中的表示方式。如果是递归数据结构,递归是唯一的武器…

这取决于二叉树在Haskell中的表示方式。如果是递归数据结构,递归是你唯一的武器…

所以递归很容易,不是吗

import Data.Maybe (isJust)

getBalancedSize :: (Monad m, Num b, Ord b) => BinaryTree a -> m b
getBalancedSize Empty = return 0
getBalancedSize (Node _ l r) = do
    sizeL <- getBalancedSize l
    sizeR <- getBalancedSize r
    if abs (sizeL - sizeR) <= 1
        then return $ sizeL + sizeR + 1
        else fail "tree is not balanced"

isBalanced :: BinaryTree a -> Bool
isBalanced = isJust . getBalancedSize
有一种显而易见的方法可以将
getBalancedSize
重构为对
fold
的单个调用

getBalancedSize = fold f (return 0) where
    f _ l r = do
        sizeL <- getBalancedSize l
        sizeR <- getBalancedSize r
        if abs (sizeL - sizeR) <= 1
            then return $ sizeL + sizeR + 1
            else fail "tree is not balanced"
getBalancedSize=fold f(返回0)其中
f_lr=do

sizeL所以递归非常简单,不是吗

import Data.Maybe (isJust)

getBalancedSize :: (Monad m, Num b, Ord b) => BinaryTree a -> m b
getBalancedSize Empty = return 0
getBalancedSize (Node _ l r) = do
    sizeL <- getBalancedSize l
    sizeR <- getBalancedSize r
    if abs (sizeL - sizeR) <= 1
        then return $ sizeL + sizeR + 1
        else fail "tree is not balanced"

isBalanced :: BinaryTree a -> Bool
isBalanced = isJust . getBalancedSize
有一种显而易见的方法可以将
getBalancedSize
重构为对
fold
的单个调用

getBalancedSize = fold f (return 0) where
    f _ l r = do
        sizeL <- getBalancedSize l
        sizeR <- getBalancedSize r
        if abs (sizeL - sizeR) <= 1
            then return $ sizeL + sizeR + 1
            else fail "tree is not balanced"
getBalancedSize=fold f(返回0)其中
f_lr=do

sizeL您可以定义一个存储深度的新二叉树。深度在插入和删除时更新,您可以通过查看存储的深度值来判断它是否平衡


根据更新树的频率递归计算是一个更好的解决方案。无论如何,它更干净。

您可以定义一个新的二叉树来存储它的深度。深度在插入和删除时更新,您可以通过查看存储的深度值来判断它是否平衡


根据更新树的频率递归计算是一个更好的解决方案。无论如何,它更干净。

您可以使用保证类型。不需要检查它是否平衡,因为类型可以保证平衡

isBalanced = const True

你可以使用一个类型保证。不需要检查它是否平衡,因为类型可以保证平衡

isBalanced = const True
在不考虑树的大小的情况下有效地确定树是否平衡的关键在于,一旦你知道右枝比左枝深一层以上,它到底有多深并不重要。更深两层?3.100? 我们不在乎,如果只知道结果就扔掉,可能会被认为是低效的

isBalanced :: BinaryTree a -> Bool
isBalanced = and . treeToBalanceSize

treeToBalanceSize :: BinaryTree a -> BalanceSize
treeToBalanceSize Empty      = []
treeToBalanceSize (Node l r) = True : mergeBalanceSizes (treeToBalanceSize l) (treeToBalanceSize r)

mergeBalanceSizes :: BalanceSize -> BalanceSize -> BalanceSize
mergeBalanceSizes []       []       = []
mergeBalanceSizes [x]      []       = [x]
mergeBalanceSizes []       [y]      = [y]
mergeBalanceSizes (x : xs) (y : ys) = (x && y) : mergeBalanceSizes xs ys
mergeBalanceSizes _        _        = [False]

type BalanceSize = [Bool]
让你自己满意

  • 如果
    是平衡的且大小为
    大小
    ,则
    树平衡大小树=复制大小为真
  • 如果
    tree
    不平衡,则
    treeToBalanceSize tree
    将以
    False
    结束
  • 计算
    mergeBalanceSizes[True]list
    不会导致
    list
    的计算超出其第三个元素
  • 在不考虑树的大小的情况下有效地确定树是否平衡的关键在于,一旦你知道右枝比左枝深一层以上,它到底有多深并不重要。更深两层?3.100? 我们不在乎,如果只知道结果就扔掉,可能会被认为是低效的

    isBalanced :: BinaryTree a -> Bool
    isBalanced = and . treeToBalanceSize
    
    treeToBalanceSize :: BinaryTree a -> BalanceSize
    treeToBalanceSize Empty      = []
    treeToBalanceSize (Node l r) = True : mergeBalanceSizes (treeToBalanceSize l) (treeToBalanceSize r)
    
    mergeBalanceSizes :: BalanceSize -> BalanceSize -> BalanceSize
    mergeBalanceSizes []       []       = []
    mergeBalanceSizes [x]      []       = [x]
    mergeBalanceSizes []       [y]      = [y]
    mergeBalanceSizes (x : xs) (y : ys) = (x && y) : mergeBalanceSizes xs ys
    mergeBalanceSizes _        _        = [False]
    
    type BalanceSize = [Bool]
    
    让你自己满意

  • 如果
    是平衡的且大小为
    大小
    ,则
    树平衡大小树=复制大小为真
  • 如果
    tree
    不平衡,则
    treeToBalanceSize tree
    将以
    False
    结束
  • 计算
    mergeBalanceSizes[True]list
    不会导致
    list
    的计算超出其第三个元素

  • 这就是它的定义方式:数据二进制树a=Empty |节点a(二进制树a)(二进制树a)在这种情况下,除了递归之外,没有其他方法可以从树上降下来。好的,谢谢。我一直在想方设法想办法解决这个问题,但我始终找不到任何完全正确的答案。因为这是我家庭作业中的一个问题,所以我认为还有别的办法。我使用递归找到了正确答案,但可以使用任何其他方法满足平衡二叉搜索树的要求。这就是它的定义方式:data BinaryTree a=Empty | Node a(BinaryTree a)(BinaryTree a)在这种情况下,除了递归之外,没有其他方法可以从树上往下走。好的,谢谢。我一直在想方设法想办法解决这个问题,但我始终找不到任何完全正确的答案。因为这是我家庭作业中的一个问题,所以我认为还有别的办法。我使用递归找到了正确的答案,但可以使用任何其他方法满足平衡二叉搜索树的要求。二叉树是如何表示的?二叉树是如何表示的?在类型中编码红黑不变量,然后实际使用树是可能的,但一点也不容易。如果你想得到所有的typey,你最好选择2-3棵树、2-3-4棵树或AVL树。代码很多,但结构更统一。红-黑不太复杂。在我的尝试中,红黑的代码比AVL.Huh的代码要短。我很惊讶。我在《红黑》上看到的论文在很大程度上影响了效率,我记得。@dfeuer:还没有对效率进行基准测试。可能还有其他更有效的树,我不知道..在类型中编码红黑不变量,然后实际使用这些树是可能的,但一点也不容易。如果你想得到所有的typey,你最好选择2-3棵树、2-3-4棵树或AVL树。代码很多,但结构更统一。红-黑不太复杂。在我的尝试中,红黑的代码比AVL.Huh的代码要短。我很惊讶。我在《红黑》上看到的论文在很大程度上影响了效率,我记得。@dfeuer:还没有对效率进行基准测试。可能还有其他更高效的树,我不知道。。