如何识别AVL树中的干扰节点
How to identify disturbed node in AVL tree?
我正在编写一个AVL插入函数。请告诉我如何识别在插入新节点时平衡受到干扰的节点?我知道如何计算任何节点的余额因子。但是,如果我将节点添加为叶子,我怎么知道平衡受到干扰的祖先节点?这样我就可以对它应用旋转。谢谢期待。
添加叶子后,您可以逐个向上移动到根部的父项,并更新它们的高度(如果需要,也可以更新它们的深度)。当您更新树的高度时,您可以检查它们是否失去平衡并重新平衡它们。然后你继续向上移动。
这是一个O(log(n))
操作,因为从 AVL 树中的任何叶到根的路径包含O(log(n))
节点,并且重新平衡节点是在O(1)
一旦你得到平衡因子(在我的例子中,(左子树的高度 - 右子树的高度)),
- 如果平衡因子大于 1,则当前节点不平衡,我们要么处于左左大小写,要么处于左右大小写。要检查它是否左写,请将新插入的键与左子树根目录中的键进行比较。
- 如果余额因子小于 -1,则当前节点为不平衡,我们要么处于右右大小写,要么处于右左大小写。要检查它是否是正确的大小写,请比较新的插入的键,键在右子树根中。
这回答了你的问题吗?
相关文章:
- 反向给定链表中的K节点
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Boost Graph Library,修复节点大小
- C++A*算法并不总是在路径中具有目标节点
- 如何找到2个单链表的公共节点
- AddDllDirectory会干扰后续的LoadLibraryExW
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 为什么我的删除节点函数实际上没有删除节点?
- 我们可以删除链表中静态内存中的节点吗
- 如何在pugixml中获取节点的内部XML
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 节点 *temp; 和节点 *tmp = 新节点之间的差异
- 引擎节点:未定义的符号:_ZTV6Config
- 为什么"delete"关键字不删除节点?
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 如何按数字顺序插入链表节点?
- 如何识别AVL树中的干扰节点