当前位置: 首页 > 知识库问答 >
问题:

遗传排序的Haskell二叉树谓词

常经赋
2023-03-14

对哈斯克尔来说真的很新鲜,我想不通。如何检查给定二叉树中的节点是否大于其子节点?

module IntTree where

data IntTree = Leaf Int
             | Node Int IntTree IntTree
             deriving (Eq,Show)

t1 :: IntTree
t1 = Node 1999 (Node 1963 (Leaf 1925)
                          (Leaf 1933))
               (Node 1956 (Leaf 1932)
                          (Leaf 1924))


t2 :: IntTree
t2 = Node 1999 (Node 1922 (Leaf 1925)
                          (Leaf 1933))
               (Node 1956 (Leaf 1932)
                          (Leaf 1924))

descendingTree :: Ord a => IntTree -> Bool

函数< code>descendingTree将获得一个< code>IntTree并将返回给我一个Boolean值,表明对于树中的每个节点,该节点的值是否大于其两个子节点的值;如果它有孩子的话。这个函数怎么写?

共有1个答案

梁骞仕
2023-03-14

答案是 :慢慢地 直接遵循你的数据类型定义。

descendingTree :: IntTree -> Bool     -- no `a`, so no `Ord a` too
-- data IntTree = Leaf Int
descendingTree   (Leaf i) = leaf i
--              | Node Int IntTree IntTree
descendingTree   (Node  i     lt     rt  ) = node i lt rt

如果是叶子,就没什么好检查的了:

leaf _ = True

如果它是一个节点,它总是有两个子节点;这是由它的类型定义保证的。类型中没有其他可能性。

node i lt rt = 

在这里,您需要填写您的测试:

        i > value lt &&
        i > value rt &&

这两个检查将被完成;如果一个失败了整个

        every_node_is_greater .... &&
        every_node_is_greater ....

你能填空吗?

能写出< code > every _ node _ is _ greater 的定义吗?你需要吗?

当然,函数< code>leaf和< code>node是完全冗余的;它们在这里只充当了精神上的垫脚石,为我们清除了写作的障碍。:)您通常将代码写在< code>descendingTree定义中相应的子句中。

这里还需要为value编写一个定义,这是我们在探索问题空间时引入的新抽象(“如果我们有办法知道节点的“值”呢?我们稍后会处理细节…”)。现在终于是充实它的时候了。同样,简单地(缓慢地)遵循类型,并处理它呈现的案例。

 类似资料:
  • 主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:

  • HLOJ 9576,习题7-2 二叉排序树 输入一个整数关键字序列,生成一棵用链式存储结构存储的二叉排序树,对该二叉排序树能进行查找和插入结点的操作,并对该二叉排序树中结点的关键字按递增和递减顺序输出。 要求依次完成以下工作: (1) 以这n个整数生成(建立)一棵用链式存储结构存储的二叉排序树; (2) 按递增顺序输出该二叉排序树中的整数(关键字); (3) 输入一个整数key1,对该二叉排序树进

  • 我正在学习,在本教程中,可以使用并发和通道来完成这个练习:解决方案。 我试图通过解决这个问题。我能想到的解决方案是使用临时数据结构来存储顺序遍历这两棵树的结果,然后进行比较。 例如,我使用存储顺序遍历的结果,然后进行比较(注意,我们正在比较排序的二叉树): 测试用例: 我想知道有没有其他更好的方法通过解决这个问题?

  • 我刚刚开始学习Haskell,我正在尝试编写一个代码来搜索二叉树中的特定值,如果当前返回true,否则返回false这就是我的树结构的样子 我不确定如何继续遍历树并返回值的函数。我确实尝试了BFS和DFS,但我不确定一旦得到值后如何返回。 我的函数应该是什么样子的一个例子

  • 判断是否二叉排序树 根据带虚结点的先序序列建立二叉树,然后判断其是否为二叉排序树。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据在一行中输入一个数字字符串(不含’0’且长度不超过20),表示二叉树的先序遍历序列,其中字符*表示虚结点(对应的子树为空)。 输出格式: 对于每组测试,输出是否二叉排序树的判定结果,是输出“YES”,否则输出“NO”。引号不必输出。 输入样例: 5687* 54

  • 我有下面的“height”函数,它返回树的高度。然而,当我尝试使用它时,我得到了这个异常。我怎样才能修好它?我还有一个函数“isBalancedTree”,它检查给定的树是否平衡。 *主要 ***异常:函数高度中的非穷尽模式