【问题标题】:How can I convert a Binary search tree to a List如何将二叉搜索树转换为列表
【发布时间】:2019-07-30 07:23:47
【问题描述】:

所以,我给自己编写了一个二叉搜索树,它基本上已经完成了。删除、搜索、添加、打印:全部实现。不过,我现在想做的是添加一个删除重复项的函数。我没有说明我在用什么语言做这件事,因为我不是在寻找代码解决方案,而是在正确的方向上轻推。

我有一个像这样递归打印树的函数:

private void PrintTree(BinarySearchTreeElement<T> currentNode)
{
    if (currentNode == null)
    {
        return;
    }
    this.PrintTree(currentNode.leftChild);
    Console.Write(currentNode.ElementValue + ", ");
    this.PrintTree(currentNode.rightChild);
}

它工作得很好,通过它非常快。我想知道我是否可以使用这种方法,但我的问题是我不知道如何在其中实现一个列表。递归让我有点困惑,所以我不知道只是向参数添加一个列表是否有效,但我认为不会。 (如果这是完全错误的删除重复项的方法,请告诉我,但我仍然想要这个功能。)

我尝试过更改此设置,但使用列表作为返回参数,它给了我一个“并非所有路径都返回一个值”,这让我更加困惑,让我觉得我的方法完全错误

【问题讨论】:

  • 您是要获取所有元素的列表、删除重复项还是获取没有重复项的元素列表?
  • 我只想要一个元素列表。一旦我有了列表,我已经知道如何解决重复问题

标签: graph tree binary-search-tree


【解决方案1】:

如果你想继续递归,它可能看起来像这样:

private void CreateList(BinarySearchTreeElement<T> currentNode, List<T> list)
{
    if (currentNode == null) return;
    this.CreateList(currentNode.leftChild, list);
    list.Add(currentNode.ElementValue);
    this.CreateList(currentNode.rightChild, list);
}

或者这个

private List<T> CreateList(BinarySearchTreeElement<T> currentNode)
{
    if (currentNode == null) List<T>();
    return this.CreateList(currentNode.leftChild).addAll(this.CreateList(currentNode.rightChild));
}

如果您的二叉树是平衡的,您可以考虑存储 tree in an array 而不是您当前的实现,并引用左右子节点。

【讨论】:

  • 非常感谢!我的树不平衡,但我接下来要做一棵红黑树
  • 在第 4 行和第 6 行中,您只调用只有 1 个参数的方法,而在第二个代码中,它是“不可调用的成员列表 不能用作方法”和 Operator '+ '不能用于list和list
  • 是的,我没有尝试运行它,因为你说你不是在寻找代码解决方案,而且我不习惯 Java。希望它现在有效。
猜你喜欢
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 2011-04-14
  • 2012-07-15
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多