AVL树左旋转, 右旋转代码实现
我们这里先给出左旋转实现
private void leftRototate(){
Node newNode = new Node(this.value);
newNode.left = this.left;
newNode.right = this.right.left;
this.value = right.value;
right = right.right;
left = newNode;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 注意: 这个方法是在Node(结点类)中定义的, 其中的this表示的是某个结点, 具体这个方法最终是要在添加结点操作中执行, 我们最终每次调用这个方法的结点都会是我们需要左旋的结点
- 如果是RR型最小不平衡子树, 那么需要左旋的就是最小不平衡子树的根节点
- 如果是LR型最小不平衡子树, 那么需要左旋的就是最小不平衡子树的根节点的左子节点
然后给出右旋转实现
private void rightRotate(){
Node newNode = new Node(this.value);
newNode.right = this.right;
newNode.left = this.left.right;
this.value = this.left.value;
this.left = this.left.left;
right = newNode;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 这个方法也是一样的, 是定义在Node结点类中的, 最终调用该方法的结点都会是需要右旋的结点,
- 如果是LL型的最小不平衡子树, 需要右旋的结点就是最小不平衡子树的根节点
- 如果是RL型最小不平衡子树, 需要右旋的结点就是最小不平衡子树的根节点的右子节点
注意: 我们的AVL树中是没有双旋转这个算法的, 所谓的双旋转其实就是在最小不平衡子树为LR型和RL型的时候要分别调用一次左旋和一次右旋也就是两次旋转 —> 所以说AVL树中的算法只有左旋转和右旋转, 我们只要在对应的实际去使用对应的对象去调用对应的旋转算法就能使得我们的树重新平衡化