我正在学习AVL Tree并在递归代码中获得TLE。我的导师建议迭代解决方案。我搜索并找到一个解决方案,将父节点保存在子节点中。 我不知道这个可能会在内存中出现问题,不是吗? 还有另一种方法可以在AVL树中插入,删除不需要在子节点中保存父节点吗?请给我一个提示。
答案 0 :(得分:3)
实现AVL树时有几种选择: - 递归或迭代 - 商店余额系数(右边的高度减去左边的高度)或高度 - 是否存储父参考
递归高度倾向于提供最优雅的解决方案,但迭代在某些情况下可能表现更好,因此值得考虑。 您可以阅读有关选择: http://www.eternallyconfuzzled.com/tuts/datastructures/jsw_tut_avl.aspx 并在Java中查看迭代实现: https://github.com/dmcmanam/bbst-showdown
答案 1 :(得分:0)
在迭代(非递归)方法中需要父级引用,因为在插入/删除之后必须进行回溯,所以我们可以在递归方法中使用堆栈进行回溯,而在迭代方法中只能使用父级引用进行回溯。参见https://en.wikipedia.org/wiki/AVL_tree#Insert和https://en.wikipedia.org/wiki/AVL_tree#Delete。
此插入之后,有必要检查节点的每个祖先与AVL树的不变量的一致性:这称为“重新跟踪”。
这是C中https://github.com/xieqing/avl-tree的基于迭代BalanceFactor的AVL树实现: