通过继承实现AVL树

时间:2016-11-28 10:29:38

标签: c++ binary-tree binary-search-tree avl-tree

我被要求实现一个AVL树,我做到了 - 现在它适用于我能想到的所有压力测试。现在我看到我们被建议实现它,它继承自二叉树继承的二叉搜索树。我想它是正确的 - 我很乐意得到关于哪些不变量(必须出现的字段)应该出现在每个变量(二叉树,搜索和AVL)中的建议。 谢谢! 这是我的实现: enter image description here

1 个答案:

答案 0 :(得分:2)

我会给你一些提示。在编写面向对象的代码时,我发现自上而下设计很有用 - 即实现父类,然后继承并决定需要添加/覆盖的内容。

示例:

二叉树:

  1. 嗯,你显然需要一个节点,有两个孩子(你如何实现这是你的事情)。节点需要一个数据字段。
  2. 插入 - 没有限制,您可以在节点之后插入到左侧,右侧或替换父节点。您实施了哪些以及由您决定的方式。
  3. 遍历 - 左转比右转,右转比左等......
  4. 查找没有限制,因此您必须遍历整个树(最坏情况)
  5. 所有这些都是二叉树的一般属性。你可以拿出更多(打印用于调试用途......)。我们继承了所有这些,并从:

    开始

    二进制搜索树

    1. 节点并没有真正改变,是吗?
    2. 好了,现在插入根本没有你决定!您不会插入到插入整个树的特定节点。您需要查找要插入的位置,然后可以调用基本插入
    3. Traversal不会改变吗?
    4. 可以大幅改进查找,并且可能应该完全覆盖。
    5. 你可以想到对于非有序搜索树没有意义的新方法,尽管我没有想到任何想法。有些人可能会考虑在节点上添加 compare (少于例如)运算符,将其重载以与数据类型或其他节点进行比较。
    6. 最后,您继承此项以生成 AVL 树。尝试并考虑可以继承的内容,需要完全覆盖的内容,以及在调用基类之前需要做些什么工作。你可以google / wikipedia进行常见的树操作(例如我没有提到删除)。祝你好运。

      修改

      AS davmac提到,AVL的节点发生了变化 - 它需要一个额外的字段!我们有两个孩子,我们继承了数据字段,但现在我们还需要一个平衡因子。这是何时添加字段的示例。