二叉树挑战示例

时间:2013-05-12 10:24:14

标签: algorithm search tree binary-tree

我一直在观看优秀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)))

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

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

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

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

这些问题并非无足轻重,而是会花时间,但你肯定会从中学习。

基本上,存在大量基本上需要二进制树的问题。例如,在命题逻辑中构建推理算法。

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