主要实现思路为左旋转和右旋转
代码
package com.atguigu.avlTreeDemo;
import java.util.Objects;
/**
* avl树:平衡二叉树
*/
public class AvlTreeDemo {
public static void main(String[] args) {
//左旋转测试开始
/* int[] arr = {4,3,6,5,7,8};
AvlTree avlTree = new AvlTree();
for (int num:arr) {
avlTree.add(new Node(num));
}
System.out.println("树的前序遍历结果为");
avlTree.infixOrder();
System.out.println("根节点为" + avlTree.root);
System.out.println("树的高度为" + avlTree.hight());
System.out.println("树的左子树高度为" + avlTree.leftHight());
System.out.println("树的右子树高度为" + avlTree.rightHight());*/
//左旋转测试结束
/*//右旋转测试开始
int[] rightRotate = {10,12,8,9,7,6};
AvlTree rightTree = new AvlTree();
for (int num:rightRotate) {
rightTree.add(new Node(num));
}
System.out.println("右旋转测试数的中序遍历结果为");
rightTree.infixOrder();
System.out.println("树的根节点为" + rightTree.root + "\n树的高度为" + rightTree.hight() +
"\n树的左子树的高度为" +rightTree.leftHight() + "\n树的右子树的高度为" + rightTree.rightHight());
//右旋转测试结束*/
//双旋转测试开始
int[] rightRotate = {
10,11,7,6,8,9};
AvlTree rightTree = new AvlTree();
for (int num:rightRotate) {
rightTree.add(new Node(num));
}
System.out.println("右旋转测试数的中序遍历结果为");
rightTree.infixOrder();
System.out.println("树的根节点为" + rightTree.root + "\n树的高度为" + rightTree.hight() +
"\n树的左子树的高度为" +rightTree.leftHight() + "\n树的右子树的高度为" + rightTree.rightHight());
//双旋转测试结束
}
}
/**
* 平衡二叉树的主体
*/
class AvlTree{
public Node root;
public AvlTree() {
}
public AvlTree(Node root) {
this.root = root;
}
/**
* 此方法为左旋转的方法
* 步骤:
* 1、创建一个新的节点:值为根节点的值
* 2、新节点的右子节点为根节点的右节点的左节点
* 3、新节点的左子节点为根节点的左节点
* 4、将根节点的右节点的值赋值给根节点
* 5、根节点的右节点为右节点的右节点
* 6、根节点的左节点为新节点
*/
public void leftRotate(){
if (root == null){
return;
}
root.leftRotate();
}
//添加节点
public void add(Node node){
if (root == null) {
root = node;
} else {
root.add(node);
}
}
//树的高度
public int hight(){
return root == null?0:root.hight();
}
//树的左子树的高度
public int leftHight(){
return root == null?0:root.leftHight();
}
//树的左子树的高度
public int rightHight(){
return root == null?0:root.righttHight();
}
//删除节点