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

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

贺博厚
2023-03-14

我试图在Scala中创建一个非常简单的二叉树,用于数据存储和遍历。

现在我有:

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

我的问题:

>

  • 我怎样才能包含指向家长的指针?

    我能以任何方式将左和右指向null吗?还是根节点的父指针?

    我怎样才能真正穿越这棵树?

    更新节点的值容易吗?

  • 共有1个答案

    谢誉
    2023-03-14

    >

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

    是的,我们通常用一个trait的单例实例对象)来表示:

    case object EmptyNode extends Tree
    

    有很多算法,广度优先搜索和深度优先搜索是最常见的。这是一个很好的实践。但在Scala方面,我们通常会在左侧右侧进行模式匹配,以查看下一步需要做什么:

    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
    }
    

    不,您的猜测是正确的,在树中使用不可变大小写类很难更新,因为如果您更新叶节点,那么您必须重新创建它上面的所有内容。有所谓的镜头和镜头库可以帮助您解决这个问题,尽管它们可能更高级一点。Scala中一个流行的是Monocle。

    您似乎刚刚开始编程,或者刚刚接触Scala,所以我建议使用var-s而不是vals:

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

    此外,如果您的特征是密封的(密封的特征树),那么编译器会告诉您是否没有处理模式匹配中的子类型之一。

    编辑:

    根据评论,开始使用以下内容:

    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
    

  •  类似资料:
    • 我在windows Server2008上运行的是Neo4j版本1.7.2。

    • 本文向大家介绍二叉排序树的实现与基本操作,包括了二叉排序树的实现与基本操作的使用技巧和注意事项,需要的朋友参考一下 二叉排序树又称二叉查找树。它或者是一颗空树,或者是具有以下性质的二叉树: ①如果左子树不空,那么左子树上所有结点的值均小于它的根结点的值; ②如果右子树不空,那么右子树上所有结点的值均大于它的根结点的值; ③左右子树也分别为二叉排序树。 以下代码实现了: 二叉树的构建 二叉树的中、前

    • 问题内容: 我的Mac上安装了Python Scrapy,我正尝试在其网络上遵循第一个示例。 他们正在尝试运行命令: 我不太明白这是什么意思?看起来scrapy原来是一个单独的程序。而且我认为他们没有一个称为“抓取”的命令。在示例中,他们有一段代码,这是类MininovaSpider和TorrentItem的定义。我不知道这两个类应该去哪里,去同一个文件,这个python文件的名字是什么? 问题答

    • 接受的答案可以做一棵完美的树(这也是一棵完整的树)。虽然它不能在没有完美的情况下做成一棵完整的树。不过,这是我的要求最接近的答案。为了在不完美的情况下进行竞争,你可以去掉树最右边的叶子。 1.问题: 试图将< code >二叉查找树变成< code >完整的二叉查找树。我可以找到很多< code >完全二叉树的代码示例,但是没有< code >完全二叉查找树。这个插件的工作就像二叉查找树应该做的那

    • 我有一个二叉树,我想打印所有非边界节点。边界节点:-所有叶节点从根到最左节点路径上的所有节点所有节点从根到最右节点。 我在树结构中使用了一个额外的布尔值来确定它是否是边界节点,如果不是边界节点,则进行遍历和打印。有人能想出一个更好的方法吗,因为它使用了一些额外的空间(虽然很少)。

    • 二叉树查找 思路说明 二叉树查找是一个面对动态数据比较常用的查找算法。本文根据下面地址文章翻译,并根据本人的理解进行适当修改。 原文地址:http://www.laurentluce.com/posts/binary-search-tree-library-in-python/comment-page-1/ 二叉树查找的定义 定义内容可以参阅Wikipedia:http://en.wikipedi