【问题标题】:Binary tree challenge example [closed]二叉树挑战示例[关闭]
【发布时间】:2013-05-12 10:24:13
【问题描述】:

我一直在观看优秀的Richard Buckland 的一些讲座并尝试使用二叉树,但我并不完全了解如何实现它。下面是我已经走了多远。

class Tree(object):
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

t = Tree(4, Tree(2, Tree(1), Tree(3)), Tree(6, Tree(5), Tree(7)))

有人可以向我推荐一个可以使用二叉树解决的简单示例问题。我真的不明白创建树将提供哪些数据或如何实际使用它。我害怕谷歌搜索一些例子,因为 我不想要别人的源代码。我想自己制定实施。 但在我能做到这一点之前,我觉得我需要解决一个问题。理想情况下,我想要几个相当简单的示例问题,然后是一些中间问题。

【问题讨论】:

标签: algorithm search tree binary-tree


【解决方案1】:

您上面的代码是二叉树的“有效”实现......它已经完成了。您有节点(称为 Trees),每个节点可以有 0、1 或 2 个子节点。 编辑实际上我刚刚意识到你不能使用你的实现来实现一个空树,但这是一个小问题。

这是一个语义上的东西,但它“有点重要”。二叉树本身并没有真正用于解决问题。一棵标准的二叉树并不是很有用——它只是一棵树,其中每个节点最多有两个孩子。这个链接应该澄清我在说什么(并且可能包含对您问题的充分回答):https://stackoverflow.com/a/2159506

我认为您真正感兴趣的是具有额外属性的“平衡二叉搜索树”。特别是,它是从左到右“排序”的(这是一个模糊的描述,但我不想挥手说“左孩子小于父母及其兄弟姐妹”实际上可能是在某些实现中相等)。它还有一个O(log(n)) 有界深度(你不会有高度为nn 对象的树......这只是一个链表)。

无论如何,回答您的问题:这有点无聊,但一个常见的建议是实现一个抽象数据结构,例如堆或字典。注意术语:堆可以使用二叉搜索树来实现。根据定义,堆与任何实现无关。它只要求可以对其执行某些操作(例如peek(), min(), add()等)。选择像二叉树这样的原始数据结构是生成堆所必需的(否则它只是浮在脑海中的这个抽象事物)。选择平衡二叉搜索树也会给这些操作带来时间复杂度(例如,使用平衡二叉搜索树实现的堆有 O(log(n)) peek()。有关更多详细信息,请参阅 wiki 链接:http://en.wikipedia.org/wiki/Heap_(data_structure)#Comparison_of_theoretic_bounds_for_variants)。

一旦您编写了一个堆,您就可以查看算法使用堆的任何问题......有很多。假设您想在线性时间内找到kth 最大的元素。堆(虽然证明这有点棘手)。如果你想实现 Prim 的算法呢?堆。如果您想对最坏情况O(n log(n)) 的任意对象进行排序怎么办?堆排序(请注意,通常人们不使用堆排序,因为它实际上并不快)。

【讨论】:

    【解决方案2】:

    好吧,试试这个:http://www.spoj.com/problems/TREE/

    或者这个:http://www.spoj.com/problems/THREECOL/

    http://www.spoj.com/problems/NWERC11B/

    这些问题都不是小事,会问时间,但你一定会从中吸取教训。

    基本上,有大量的问题在某种程度上需要二叉树。例如,在命题逻辑中构建推理算法。

    是的,如果你能掌握 Sedgewick 的算法,有一些关于二叉搜索树的章节,例如,非常有用。

    【讨论】:

      猜你喜欢
      • 2015-09-13
      • 1970-01-01
      • 2012-11-06
      • 2017-01-25
      • 2014-10-07
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多