一.下图为左旋转示例:
- 首先,当二叉排序树添加了最后一个节点8的时候,不满足AVL树的条件,因为此时:
- 树的整体高度为4,右子树高度为3,左子树的高度为1,3-1>1,所以需要左旋了
- 直接对该树root=4,进行左旋即可
root根节点左旋条件为:右子树len - 左子树len > 1;
root根节点右旋条件为:左子树len - 右子树len > 1;
二.下图为右旋同理:
三.下图为右旋前先左旋转示例:
四.同理左旋前判断是否需要先右旋:
public class Main33 {
private static void avl(Node root, Node temp, int ele) {
if (temp.val > ele){
if (temp.left == null){
temp.left = new Node(ele);
}else {
avl(root, temp.left,ele );
}
}else {
if (temp.right == null){
temp.right = new Node(ele);
}else {
avl(root, temp.right,ele );
}
}
if ((root.left !=null && root.right != null) && (treelen(root.left) - treelen(root.right) > 1) ){
if ((root.left.right !=null && root.left.left != null) && treelen(root.left.right) > treelen(root.left.left)) {
leftspin(root.left);
}else {
rightspin(root);
}
return;
}
if ((root.left !=null && root.right != null) && treelen(root.right) - treelen(root.left) > 1){
if ((root.right.left !=null && root.right.right != null) && treelen(root.right.left) > treelen(root.right.right)){
rightspin(root.right);
}else {
leftspin(root);
}
}
}
private static void rightspin(Node root) {
Node node = new Node(root.val);
node.right = root.right;
node.left = root.left.right;
root.val = root.left.val;
root.right = node;
root.left = root.left.left;
}
private static void leftspin(Node root) {
Node node = new Node(root.val);
node.left = root.left;
node.right = root.right.left;
root.val = root.right.val;
root.left = node;
root.right = root.right.right;
}
private static int treelen(Node node) {
return Math.max(node.left == null ? 0 : treelen(node.left), node.right == null ? 0 : treelen(node.right)) + 1;
}
private static void pre(Node root) {
if (root == null)
return;
System.out.println(root.val);
pre(root.left);
pre(root.right);
}
public static void main(String[] args) {
int[] array = {10,11,7,6,8,9};
Node root = new Node(array[0]);
Node temp = root;
for (int i = 1; i < array.length; i++) {
avl(root,temp,array[i]);
}
pre(root);
}
}
class Node{
public int val;
public Node left;
public Node right;
public Node(int val){
this.val = val;
}
}