在 Scala 中制作一个非常基本的二叉树

2024-03-08

我正在尝试在 Scala 中制作一个非常简单的二叉树,用于数据存储和遍历。

现在我有:

trait Tree
case class Node(left: Tree, value: String, right: Tree) extends Tree

我的问题:

  1. 我怎样才能包含一个指向父级的指针?

  2. 我可以以任何方式将左指针和右指针设置为空吗?或者根节点的父指针?

  3. 我怎样才能真正遍历这棵树?

  4. 更新节点的值容易吗?


  1. 不适用于不可变的案例类。这是一种循环依赖:您需要父级来创建子级,但也需要子级来创建父级。另一方面,大多数树遍历算法实际上并不需要父级,因为父级通常位于堆栈上或可以存储在某个地方。

  2. 是的,我们通常用单例实例来表示这些(object) 的特征:

    case object EmptyNode extends Tree
    
  3. 有很多算法,广度优先搜索和深度优先搜索是最常见的。实施它们是一个很好的练习。但在 Scala 方面有一点帮助,我们通常在left and right看看我们接下来需要做什么:

    tree: Tree match {
      case EmptyNode => // do nothing, return, etc.
      case Node(left, value, right) =>
        // Do inorder, preorder, postorder operation order
        // You will also probably be processing left and right as well
    }
    
  4. 不,您的猜测是正确的,在树中使用不可变的案例类很难更新,因为如果您更新叶节点,则必须重新创建其上方的所有内容。有所谓的镜头和镜头库可以帮助您解决此问题,尽管它们可能更先进一些。 Scala 中流行的一种是Monocle https://github.com/julien-truffaut/Monocle.


看起来你刚刚开始编程或者是 Scala 新手,所以我建议使用var-s 代替vals:

case class Node(var left: Tree, var value: String, var right: Tree) extends Tree

另外如果你的特质被封印了(sealed trait Tree)那么编译器会告诉您是否没有处理模式匹配中的子类型之一。

EDIT:

根据评论开始处理:

sealed trait Tree
case class Node(var left: Tree, var value: String, var right: Tree, var parent: Tree) extends Tree
case object EmptyNode extends Tree
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Scala 中制作一个非常基本的二叉树 的相关文章

  • Scala:如何编写将类型化为接收者的实现类型的对象返回的方法

    我知道 Scala 中不推荐使用案例类继承 但为了简单起见 我在以下示例中使用了它 scala gt case class Foo val f String def foo g String Foo this copy f g define
  • 对于空列表,max() 应该返回什么?

    Got java util NoSuchElementException head of empty list所以我试着检查一下 但现在我明白了 info max of a few numbers FAILED info 0 did not
  • 将 Scala 库转换为 DLL (.NET)

    我正在尝试从 scala 类创建一个 Dll 我将 IntelliJ 与 SBT 一起使用 我已经找到了一种使用 ikvm converter 将 jar 文件转换为 Dll 的方法 现在的问题是 当我在 SBT 下使用 package 从
  • Scala Array.apply 有何魔力

    来自 scala 2 10 4 的 array scala Array定义为 final class Array T length Int extends java io Serializable with java lang Clonea
  • 最小重复子串

    我正在看 Perl代码高尔夫页面 http www perlmonks org node id 82878 不要问为什么 并遇到了这个 第 3 洞 最小重复图案 编写一个子例程 它接受一个字符串 该字符串可能包含 重复模式 并返回最小的重复
  • 如何发现 Scala 远程 Actor 已死亡?

    在 Scala 中 当另一个 远程 actor 终止时 可以通过设置 trapExit 标志并以第二个 actor 作为参数调用 link 方法来通知一个 actor 在这种情况下 当远程参与者通过调用 exit 结束其工作时 第一个参与者
  • 使用 Spray-json 解析简单数组

    我正在尝试 但失败了 了解 Spray json 如何将 json feed 转换为对象 如果我有一个简单的 key gt value json feed 那么它似乎可以正常工作 但是我想要读取的数据出现在如下列表中 name John a
  • 不支持的身份验证令牌,仅当禁用身份验证时才允许 schema='none':{ schema='none' } - Neo4j 身份验证错误

    我正在尝试使用 neo4j spark connector 从 Spark 连接到 Neo4j 当我尝试连接到 Neo4j 时遇到身份验证问题org neo4j driver v1 exceptions AuthenticationExce
  • Java 表达式树 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有相当于 net的 LINQ 下的表达式树JVM 我想实现一些类似 LINQ 的代码结构Scala
  • 使用 Spark DataFrame 获取组后所有组的 TopN

    我有一个 Spark SQL DataFrame user1 item1 rating1 user1 item2 rating2 user1 item3 rating3 user2 item1 rating4 如何按用户分组然后返回TopN
  • Scala 和变量中的模式匹配

    我是 Scala 新手 有点想知道模式匹配是如何工作的 想象一下我有以下内容 case class Cls i Int case b Cls i gt Ok case e Cls gt Ok case f Cls gt Ok case s
  • 缓存 Slick DBIO 操作

    我正在尝试加快 SELECT FROM WHERE name 的速度Play 中的查询类型 Scala 应用程序 我正在使用 Play 2 4 Scala 2 11 play slick 1 1 1 包 该软件包使用Slick 3 1版本
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • 使用 C++ 和 BOOST 读取 JSON 文件

    HTTP 服务器向我发送一个 JSON 响应 字符串 如下所示 folders id 109 parent id 110 path 1 105 110 id 110 parent id 105 path 1 105 files id 26
  • GXT 3 中树的单击处理程序?

    我一直在翻阅GXT3 s Tree API http dev sencha com deploy gxt 3 0 0 rc2 javadoc gxt com sencha gxt widget core client tree Tree h
  • 使用 Apache Spark 读取 JSON - `corrupt_record`

    我有一个json file nodes看起来像这样 toid osgb4000000031043205 point 508180 748 195333 973 index 1 toid osgb4000000031043206 point
  • Akka Streams / HTTP:从响应中获取原始请求

    我有一个 Akka Streams 源 它会遍历流程并发布 HTTP 请求 source map toRequest via Http outgoingConnection host map toMessage 假设toRequest方法将
  • 使用 Scala 进行网页抓取 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何访问 Scala XML 中的父元素

    The scala xml包表示带有标记树节点的 XML 但是这棵树在 Scala 2 7 中是单向的吗 因为似乎没有办法访问Elem给定的父级Elem 这似乎同样适用于父母Document 例如 在 XOM 中你有getParent an
  • scala中的协变类型参数需要在java接口中保持不变

    我有一个看起来像这样的特征 一些进一步的信息可以在我自己提出了这个相关问题 https stackoverflow com questions 3695990 inheritance and automatic type conversio

随机推荐

  • Spring中@Secured与@RolesAllowed之间的区别?基于角色的安全的概念是什么?

    我正在学习Spring Security 我对以下有关使用之间的区别有疑问 Secured注释和 RolesAllowed注解 我知道两者都必须用于方法级别 在我的学习材料中我发现了以下2个例子 RolesAllowed注解 import
  • EJB、hibernate、spring 和 JSF 有什么区别? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对不同的java框架感到非常困惑 我想创建一个 java 服务器项目来提供一些 Restful Web 服务 但我真的不知道应该选择
  • 无法获取价值,因为它已被优化掉

    我在调试时遇到问题 突然间 我在调试时看不到大多数变量的值 我设法在立即窗口中收到两条不同的消息 无法获取本地或参数 参数 的值 因为它在此指令指针处不可用 可能是因为它已被优化掉 and 表达式求值器中出现内部错误 我已经尝试并检查了以下
  • 在 swift 中发布 json 请求

    我知道如何发布简单的 json Compose a query string let postString firstName James lastName Bond request HTTPBody postString dataUsin
  • Java上将数据库中的数据以表单的形式输出给用户

    我最近开始学习Java 我需要用 Java 编写一个 Web 应用程序 用户可以从下拉列表中的主页 html 页面上的表单中选择他所需的产品 产品列表存储在数据库的表中 使用 MySQL 然后将所选产品写入 订单历史记录 表中 如何将数据库
  • 如何修复谷歌播放服务错误

    今天更新根文件夹中的播放服务后 我面临以下问题 我很困惑如何解决这个问题 谁能帮我解决这个问题吗 这个错误非常令人恼火 我不知道冲突在哪里 顺便说一句 为什么它显示冲突 而没有版本相互关联 Error 库 com google androi
  • PHP:如何获取过去特定日期的上周日?

    我正在从数据库中检索一个条目及其关联的日期 我希望能够获取相对于该特定日期的上周日和下周六来填充 jQuery 日期选择器 我知道如何使用实际时间 日期来做到这一点 strtotime last Sunday 但我不知道除了现在以外的约会该
  • SQL Server 中的 INNER JOIN 与 LEFT JOIN 性能

    我创建了在 9 个表上使用 INNER JOIN 的 SQL 命令 无论如何这个命令需要很长时间 超过五分钟 因此 我的家人建议我将 INNER JOIN 更改为 LEFT JOIN 因为 LEFT JOIN 的性能更好 尽管我知道 改了之
  • PHP fopen 会遵循 301 重定向吗?

    我们有一段遗留代码 ab 使用fopen 通过 HTTP 调用资源 fopen http example com 我们想要将 example com 移动到另一个主机 然后发送 301 Permanently Moved 但是 我们不完全确
  • 获取 SQL 表列的总和,直到总和达到 5000

    我正在对一个包含两列的表进行 sql 查询Amount and Date应该返回总和Amount列值直到达到5000它也应该返回值Date列在Sum Amount 达到5000排序Date 例如我的数据中有以下数据SQL TABLE ID
  • 使用带有标记的谷歌街景视图,如何将 POV 指向标记?

    我有一个简单的街景视图 可以向我显示给定地址的街景视图 var geocoder new google maps Geocoder var address 344 Laguna Dr Milpitas CA 95035 geocoder g
  • 由于未安装 EntityFrameworkCore.Tools,添加迁移失败

    我想按照本教程使用 EF Core 创建一个控制台应用程序 http ef readthedocs io en latest platforms full dotnet new db html http ef readthedocs io
  • Golang并发访问固定大小的map/array

    我正在探索使用固定键并发访问地图而无需锁定的可能性 以提高性能 我之前已经探索过与 slice 类似的功能 并且似乎它有效 func TestConcurrentSlice t testing T fixed int 1 2 3 wg sy
  • Unity:从设备摄像头录制视频

    我想要一个插件或一个库或一种从设备摄像头统一 Windows 独立 录制视频 当然有声音 的方法 目前 我可以使用该相机进行屏幕截图 有人说我可以截取很多张屏幕截图并将其转换为一个视频文件 我在资源商店找到了一个名为相机拍摄 https a
  • 继承的构造函数,在 clang++3.9 中编译,在 g++ 7 中失败

    这段代码片段 struct Base struct Derived Base using Base Base int main Base b Derived d b 在 clang 3 9 上编译良好 https godbolt org g
  • 是否可以在 Python 中生成正确的 PKCS12 (.pfx) 文件?

    我需要在 python 中生成一个 PKCS12 文件 其中包含自签名证书和私钥 我为此任务组装了以下 python 代码 import OpenSSL key OpenSSL crypto PKey key generate key Op
  • 如何存储我正在开发的 Alexa 技能的数据?

    我目前正在开发一项基于医疗保健的 Alexa 技能 所以我需要存储有关疾病 诊断和症状的信息 我已经掌握了一项基本技能 包括在一个文件中包含有关一种疾病的信息 制作了一个 zip 文件 将其上传到 AWS Lambda 并获得了 Amazo
  • PyInstaller 和 Enthought 套件

    我想知道是否有人成功使用 pyinstaller 和考虑导入的脚本创建独立的可执行文件 我已经尝试这样做几天了 但是我不断收到导入错误 通过一些挖掘 我相信我可能需要添加一些隐藏的导入并创建我自己的钩子 然而 我还没有听说有人在这方面取得了
  • 人行横道项目错误“构建 ABI 'armeabi-v7a' 失败”

    我使用 ubuntu 16 04 和 crosswalk project 以及 Phonegap Cordova 来制作我的混合应用程序 我正在编译示例 https crosswalk project org documentation a
  • 在 Scala 中制作一个非常基本的二叉树

    我正在尝试在 Scala 中制作一个非常简单的二叉树 用于数据存储和遍历 现在我有 trait Tree case class Node left Tree value String right Tree extends Tree 我的问题