avl树的插入(含单旋转,双旋转)
2015-08-04 18:30
423 查看
学习中写的,所以注释少,结构杂乱,难免有不足之处,望批评改正。如有需要笔者解释的地方,请将问题发到笔者邮箱(lixding@163.com)。
public class AVLTreeClass <AnyType extends Comparable<AnyType>>{
//节点类
public static class AVLNode<AnyType>{
AnyType data;//数据
AVLNode<AnyType> leftNode;//左子树
AVLNode<AnyType> rightNode;//右子树
int height=0;//高度
public AVLNode(AnyType data){
this.data=data;
this.leftNode=null;
this.rightNode=null;
}
public AVLNode(AVLNode<AnyType> left,AVLNode<AnyType> right,AnyType data){
this.data=data;
this.leftNode=left;
this.rightNode=right;
}
public AVLNode() {}
//获取树的高度
public int getHeight(AVLNode<AnyType> node){
return node==null?-1:node.height;//空树返回-1
}
}
private AVLNode<AnyType> root=null;//定义根节点
public AVLTreeClass(){
}
public void insert(AnyType x){
root=insert(x,root);
}
public AnyType getRoot(){
return root.data;
}
private AVLNode<AnyType> insert(AnyType x,AVLNode<AnyType> node){
if(node==null){
return new AVLNode<AnyType>(x);
}
int compareConsult=x.compareTo(node.data);
if(compareConsult<0){
node.leftNode=insert(x,node.leftNode);
if(node.getHeight(node.leftNode)-node.getHeight(node.rightNode)==2){
if(x.compareTo(node.data)<0) {
node=rotateWithLeftChild(node);
}
else{
node=doubleWithLeftChild(node);
}
}
}
else if(compareConsult>0){
node.rightNode=insert(x,node.rightNode);
if(node.getHeight(node.rightNode)-node.getHeight(node.leftNode)==2){
if(x.compareTo(node.data)>0) {
node=rotateWithRightChild(node);
}
else{
node=doubleWithRightChild(node);
}
}
}
else
;//do nothing
node.height=Math.max(node.getHeight(node.leftNode), node.getHeight(node.rightNode))+1;
return node;
}
private AVLNode<AnyType> doubleWithRightChild(AVLNode<AnyType> node) {
node.rightNode=rotateWithLeftChild(node.rightNode);
return rotateWithRightChild(node);
}
private AVLNode<AnyType> doubleWithLeftChild(AVLNode<AnyType> node) {
node.leftNode=rotateWithRightChild(node.leftNode);
return rotateWithLeftChild(node);
}
private AVLNode<AnyType> rotateWithRightChild(AVLNode<AnyType> node) {
AVLNode<AnyType> node2=node.rightNode;
node.rightNode=node2.leftNode;
node2.leftNode=node;
node.height=Math.max(node.getHeight(node.leftNode), node.getHeight(node.rightNode))+1;
node2.height=Math.max(node2.getHeight(node2.leftNode),node.height)+1;
return node2;
}
private AVLNode<AnyType> rotateWithLeftChild(AVLNode<AnyType> node) {
AVLNode<AnyType> node2=node.leftNode;
node.leftNode=node2.rightNode;
node2.rightNode=node;
node.height=Math.max(node.getHeight(node.leftNode), node.getHeight(node.rightNode))+1;
node2.height=Math.max(node2.getHeight(node2.leftNode), node.height)+1;
return node2;
}
}
public class AVLTreeClass <AnyType extends Comparable<AnyType>>{
//节点类
public static class AVLNode<AnyType>{
AnyType data;//数据
AVLNode<AnyType> leftNode;//左子树
AVLNode<AnyType> rightNode;//右子树
int height=0;//高度
public AVLNode(AnyType data){
this.data=data;
this.leftNode=null;
this.rightNode=null;
}
public AVLNode(AVLNode<AnyType> left,AVLNode<AnyType> right,AnyType data){
this.data=data;
this.leftNode=left;
this.rightNode=right;
}
public AVLNode() {}
//获取树的高度
public int getHeight(AVLNode<AnyType> node){
return node==null?-1:node.height;//空树返回-1
}
}
private AVLNode<AnyType> root=null;//定义根节点
public AVLTreeClass(){
}
public void insert(AnyType x){
root=insert(x,root);
}
public AnyType getRoot(){
return root.data;
}
private AVLNode<AnyType> insert(AnyType x,AVLNode<AnyType> node){
if(node==null){
return new AVLNode<AnyType>(x);
}
int compareConsult=x.compareTo(node.data);
if(compareConsult<0){
node.leftNode=insert(x,node.leftNode);
if(node.getHeight(node.leftNode)-node.getHeight(node.rightNode)==2){
if(x.compareTo(node.data)<0) {
node=rotateWithLeftChild(node);
}
else{
node=doubleWithLeftChild(node);
}
}
}
else if(compareConsult>0){
node.rightNode=insert(x,node.rightNode);
if(node.getHeight(node.rightNode)-node.getHeight(node.leftNode)==2){
if(x.compareTo(node.data)>0) {
node=rotateWithRightChild(node);
}
else{
node=doubleWithRightChild(node);
}
}
}
else
;//do nothing
node.height=Math.max(node.getHeight(node.leftNode), node.getHeight(node.rightNode))+1;
return node;
}
private AVLNode<AnyType> doubleWithRightChild(AVLNode<AnyType> node) {
node.rightNode=rotateWithLeftChild(node.rightNode);
return rotateWithRightChild(node);
}
private AVLNode<AnyType> doubleWithLeftChild(AVLNode<AnyType> node) {
node.leftNode=rotateWithRightChild(node.leftNode);
return rotateWithLeftChild(node);
}
private AVLNode<AnyType> rotateWithRightChild(AVLNode<AnyType> node) {
AVLNode<AnyType> node2=node.rightNode;
node.rightNode=node2.leftNode;
node2.leftNode=node;
node.height=Math.max(node.getHeight(node.leftNode), node.getHeight(node.rightNode))+1;
node2.height=Math.max(node2.getHeight(node2.leftNode),node.height)+1;
return node2;
}
private AVLNode<AnyType> rotateWithLeftChild(AVLNode<AnyType> node) {
AVLNode<AnyType> node2=node.leftNode;
node.leftNode=node2.rightNode;
node2.rightNode=node;
node.height=Math.max(node.getHeight(node.leftNode), node.getHeight(node.rightNode))+1;
node2.height=Math.max(node2.getHeight(node2.leftNode), node.height)+1;
return node2;
}
}
相关文章推荐
- C# string Spilt
- 在meteor中使用支付,以及与服务器进行数据交互
- jq尺寸和位置总结篇(width scrollTop position offset)
- android中sharedpreference封装思路
- 设计模式之工厂模式
- 香蕉派 banana pi 英文论坛与GITHUB正式上线
- Objective-C的构造方法
- 蒙特卡罗随机模拟
- UITableViewDataSource协议
- POI 中Cell的backgroundcolor和foregroundcolor
- android两种没接触过的api获取方法
- redis sort命令用法
- POI根据EXCEL模板,修改内容导出新EXCEL (只支持HSSF)
- Leetcode 173 Binary Search Tree Iterator 二叉查找树迭代器
- Contact Manager Web API 异常处理(Exception Handling)
- Jedis连接池的使用
- socket 状态
- HDU 2028 Lowest Common Multiple Plus(求n个数的最小公倍数)
- java数据类型
- 带权并查集 POJ1988 POJ2492