二叉查找树(AVL)插入算法Java实现
2016-05-17 17:20
821 查看
public static class Node {
int data;
Node left;
Node right;
int height;
};
public int Height(Node p) {
if (p == null) {
return -1;
} else {
return p.height;
}
}
public Node rightRotate(Node k2)
{
Node k1;
k1 = k2.left;
k2.left = k1.right;
k1.right = k2;
k2.height = Math.max(Height(k2.left), Height(k2.right)) + 1;
k1.height = Math.max(Height(k1.left), k2.height) + 1;
return k1;
}
public Node DoubleRightRotate(Node k3) {
k3.left = rightRotate(k3.left);
return rightRotate(k3);
}
public Node Insert(int data, Node root) {
if (root == null) {
root = new Node();
root.data = data;
root.height = 0;
root.left = root.right = null;
} else if (data < root.data) {
root.left = Insert(data, root.left);
if (Height(root.left) - Height(root.right) == 2) {
if (data < root.left.data) {
root = rightRotate(root);
} else {
root.left = rightRotate(root.left);
root = rightRotate(root);
}
}
} else if (data < root.data) {
root.right = Insert(data, root.right);
if (Height(root.right) - Height(root.left) == 2){
if (data > root.right.data) {
root = leftRotate(root);
} else {
root.left = leftRotate(root.left);
root = leftRotate(root);
}
}
}
root.height = Math.max(Height(root.left), Height(root.right)) + 1;
return root;
}
int data;
Node left;
Node right;
int height;
};
public int Height(Node p) {
if (p == null) {
return -1;
} else {
return p.height;
}
}
public Node rightRotate(Node k2)
{
Node k1;
k1 = k2.left;
k2.left = k1.right;
k1.right = k2;
k2.height = Math.max(Height(k2.left), Height(k2.right)) + 1;
k1.height = Math.max(Height(k1.left), k2.height) + 1;
return k1;
}
public Node DoubleRightRotate(Node k3) {
k3.left = rightRotate(k3.left);
return rightRotate(k3);
}
public Node Insert(int data, Node root) {
if (root == null) {
root = new Node();
root.data = data;
root.height = 0;
root.left = root.right = null;
} else if (data < root.data) {
root.left = Insert(data, root.left);
if (Height(root.left) - Height(root.right) == 2) {
if (data < root.left.data) {
root = rightRotate(root);
} else {
root.left = rightRotate(root.left);
root = rightRotate(root);
}
}
} else if (data < root.data) {
root.right = Insert(data, root.right);
if (Height(root.right) - Height(root.left) == 2){
if (data > root.right.data) {
root = leftRotate(root);
} else {
root.left = leftRotate(root.left);
root = leftRotate(root);
}
}
}
root.height = Math.max(Height(root.left), Height(root.right)) + 1;
return root;
}
相关文章推荐
- spring-boot之入门实践
- Java书籍分享
- Spring中jdbcTemplate的用法实例
- Java基础01---操作符
- SpringMVC4零配置--web.xml
- Java环境设置
- springMVC -- 整合UEditor(富文本编辑器)
- java中DatagramSocket连续发送多个数据报包时产生丢包现象解决方案
- 第十七章 springboot + devtools(热部署)
- java Gzip 压缩与解压缩
- Java中堆和栈的区别
- javaweb数据库的连接
- myeclipse工程当中的.classpath 和.project文件什么作用?
- Java--银行存取款线程设计2(线程互斥)
- java序列化和RMI
- Java对象转xml报文和xml报文转Java对象帮助类
- java synchronized详解
- JAVA写注册表
- JAVA获取资源的方法
- Codeforces 66A Petya and Java