我一直在观看优秀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)))
有人可以向我介绍一个可以使用二叉树解决的简单示例问题。我真的不明白我将用什么数据来创建树或我如何实际使用它。我害怕谷歌的一些例子,因为我不想要别人的源代码。我想自己解决这个问题。 但在我能做到这一点之前,我觉得我需要解决一个问题。理想情况下,我想要一些相当简单的示例问题,然后是一些中间问题。
答案 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的算法,那么有关于二叉搜索树的章节,例如,非常有用。