如何将字符串插入 AVL 树
AVL 树是一种自平衡二叉搜索树 (BST),其中所有节点的左右子树的高度差不能超过一个。
例子:
上面的树是 AVL,因为每个节点的左右子树的高度之间的差异小于或等于1 。下面是不是 AVL 树的示例:
上面的树不是 AVL,因为 8 和 12 的左右子树的高度差大于 1。它可以定义为一种二叉搜索树,其所有节点的平衡因子为 -1 、0 或 1。
什么是平衡因子:它是两个子树之间的高度差。 (平衡因子:左子树高度 - 右子树高度)
在 AVL 树中插入字符串:
下面的示例演示在顺序中插入星期几: {Tuesday, Monday, Thursday, Saturday, Sunday, Friday, Wednesday}
方法:
- 如果节点为空( NULL ),则使用给定的第一个值创建节点。
- 如果新节点小于前一个节点,则在左侧插入新节点
- 如果新节点大于前一个节点,则在右侧插入新节点
检查树是否平衡:
- 如果平衡因子大于1 ,那么它可以是:
- Left-Left Case(然后需要单次旋转以使其平衡)。
- 或左右大小写(需要双旋转)。
- 如果平衡因子小于 -1,那么它可以是:
- Right-Right Case(需要单次旋转)。
- 或左右大小写(需要双旋转)
应重复此过程以插入所有剩余节点。
要记住的要点:
- 相应地插入节点:为了确保给定的树在每次插入后保持 AVL,增加标准 BST 插入操作以执行一些重新平衡。以下是可以在不违反 BST 属性的情况下重新平衡 BST 的两个基本操作(keys(left) < key(root) < keys(right)) 。
- 检查平衡因子:平衡因子应始终为 -1、0、1,如果不是,则需要相应地旋转树。
创建 AVL 树的步骤:
- 所以根据给定的顺序,让我们插入Tuesday ,因为它没有节点,所以它的平衡因子为0 。
- 下一步是将星期一插入星期二的左侧,因为它按字母顺序较小(M < T) 。在插入新节点之前,需要检查每个节点的平衡因子。这棵树是平衡的,因为星期二是平衡的,因为它的左侧有一个子树:
Balance Factor = height of the left subtree – the height of right subtree = 1 – 0 = 1
因此,树是平衡的。由于平衡因子 0,星期一也是平衡的。
- 接下来,插入Thursday 。它插入到星期二的左侧(如 Th < Tu) ,并插入到星期一的右侧(如 T>M) 。现在如果检查平衡因子,可以看出星期二的平衡因子是2所以它是不平衡的,所以需要旋转树使其平衡。
Note: In case if we don’t remember the rules of rotation of AVL tree, still it can be balanced we just need to remember that: Left node < Root < Right node.
Example:
5 4
/ / \
3 —–> 3 5
\
4
- 之后,在星期四的左侧(S < T)和星期一的右侧(M < S)插入星期六。
- 星期日插入到星期六(Sa < Su)的右侧。现在树是不平衡的,所以它被旋转以使其再次平衡。
- 按照同样的规则插入星期五,星期四的平衡因子变为 2,因此再次进行轮换。
- 旋转后,现在将最后一个节点星期三插入到星期二的右侧(如 T
如果检查 AVL 树,则现在整个 AVL 树是高度平衡的,因为所有节点的平衡因子为-1 , 0 , 1 。