【问题标题】:path to node in binary search tree as binary search tree二叉搜索树中节点的路径作为二叉搜索树
【发布时间】:2020-03-20 02:33:03
【问题描述】:

我正在编写一个二叉搜索树实现,并且我想要一个函数来查找节点并返回到达该路径的所有节点的双向链表。我知道双向链表可以转换为二叉搜索树,所以能够使用同一个类会非常好(而且很酷)。

但是,如果我沿途制作所有节点的浅表副本并开始更改它们的指针以构建我想要返回的二叉搜索树,我显然会破坏原始树。我不能只对所有节点进行深层复制,因为我需要对原始节点的引用,我将使用它来更改原始树(可能是删除、平衡……)。

例如,我可能有一个调用 find 的 add 函数,它返回路径中的最后一个节点,指向新节点的去向,我可以简单地将它作为其中的一个子节点。如果我正在编写一个自平衡二叉树类(红/黑树、AVL 树、Splay 树),我可以从这个类中继承它,那么至少可以访问节点的父节点和祖父节点会很好我刚刚添加了(我可以使用额外的指针进行跟踪,但是 find 方法没有那么通用)。

当然,一种解决方案是编写另一个类。另一种解决方案是满足于单链表,并使用另一个指针来引用相应的原始节点。但是,在这一点上,不仅仅是有一个可行的解决方案。我使用的语言是 Java,但我肯定有兴趣知道其他语言是否也有这方面的功能。对我来说这似乎不太可能,但我可能完全错过了一些东西。

有谁知道是否有办法做到这一点,或者对我可以做什么有任何建议?

【问题讨论】:

  • 听起来是个坏主意

标签: java binary-search-tree doubly-linked-list deep-copy shallow-copy


【解决方案1】:

所以你想使用用于二叉树的节点类来构建一个双链表。我假设这个节点类有四个字段:leffChildrightChildparentdata,其中data 保存了存储在节点上的数据。现在您可以滥用这些字段来创建双向链表,例如使用leftChild 作为双向链表中节点的prevrightChild 作为next 字段。如果这样做,您仍然可以使用该节点的parentdata 字段。因此,您可以为双向链表创建新节点,但这些节点的 parent 字段指向二叉树中的相应节点。

话虽如此,你的方法听起来有点奇怪。双向链表中的节点将有一个未使用的字段。此外,Java 提供了java.util.LinkedList,它实现了一个双向链表。所以没有必要通过混淆使用二叉树节点来滚动你自己的。

【讨论】:

  • 是的。我最终做了一些非常相似的事情。我忘了提到,我们不允许使用类来保存多个不是我们自己为作业编写的对象。
  • 虽然,我不会假设我的节点类有一个父字段。然后,它本质上已经是双重联系的。如果我要返回访问的最后一个节点,那么我已经将所有指针都返回到根节点。我认为这不是二叉搜索树的规范(有父引用)。就我而言,我有一个 Node 类并创建了一个子类 BSNode,它添加了左右指针。 Node 类有一个额外的指针“next”,我最终使用了它。
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多