java avl_AVL树的Java实现

importjava.util.Comparator;public class AVLTree>{/*AVL树:

左右子树高度绝对值最多差1的二叉搜索树

子树也是AVL树*/

private Noderoot;class Node>{

T key;intheight;

Nodeleft;

Noderight;public Node(T key, int height, Node left, Noderight) {this.key =key;this.height =height;this.left =left;this.right =right;

}publicNode(T key){this.key =key;this.height = 0;

}

}public int getHeight(Nodenode){return node == null ? 0: node.height;

}public Node LL(Nodenode){//左子树插入节点在左导致不平衡,需要旋转,以下不再赘述

Node leftNode =node.left;

node.left=leftNode.right;

leftNode.right=node;

node.height= Math.max(node.left.height,node.right.height) + 1;

leftNode.height= Math.max(leftNode.left.height, leftNode.right.height) + 1;returnleftNode;

}public Node RR(Nodenode) {

NoderightNode;

rightNode=node.right;

node.right=rightNode.left;

rightNode.left=node;

node.height= Math.max( node.left.height, node.right.height) + 1;

rightNode.height= Math.max( rightNode.left.height, rightNode.right.height) + 1;returnrightNode;

}public Node LR(Nodenode){//LR先对左子树RR再对本树LL

node.left =RR(node.left);returnLL(node);

}public Node RL(Nodenode){

node.right=LL(node.right);returnRR(node);

}public Node insert(Noderoot,T key){/*插入:先判断插入点,再判断是否需要翻转*/

if(root == null){return new Node(key);

}else{if(key.compareTo(root.key)<0)//T是实现了comparable接口的,所以这里可以比较,但不能用大小于号

{

root.left=insert(root.left,key);if(root.left.height - root.right.height == 2){if (key.compareTo(root.left.key) < 0)

root=LL(root);elseroot=LR(root);

}

}else if(key.compareTo(root.key)>0){

root.right=insert(root.right,key);if(root.left.height - root.right.height == -2){if (key.compareTo(root.right.key) < 0)

root=RL(root);elseroot=RR(root);

}

}else{return root;//相同的节点不添加

}

}returnroot;

}public Node delete(Noderoot,T key){/*删除:找到删除点,判断是否需要翻转*/

if(root == null || key == null){returnroot;

}else{if(key.compareTo(root.key)<0)//T是实现了comparable接口的,所以这里可以比较,但不能用大小于号

{

root.left=delete(root.left,key);if(root.left.height - root.right.height == -2){

Node rightNode =root.right;if (rightNode.right.height>root.left.height)

root=RL(root);elseroot=RR(root);

}

}else if(key.compareTo(root.key)>0){

root.right=delete(root.right,key);if(root.left.height - root.right.height == 2){

Node leftNode =root.left;if (leftNode.left.height>leftNode.right.height)

root=LL(root);elseroot=LR(root);

}

}else{//找到了要删除的节点

if (root.left == null) root =root.right;else if (root.right == null) root =root.left;else{if (root.left.height

Node tempNode =root.right;while (tempNode.left != null) {

tempNode=tempNode.left;

}//为保证二叉树的平衡性、搜索性//这里选择了高度较高的子树,选取中序遍历与root相邻的节点作为root,这样不会破坏搜索性

root.key =tempNode.key;

delete(tempNode, key);

}else{

Node tempNode =root.left;while (tempNode.right != null) {

tempNode=tempNode.right;

}//为保证二叉树的平衡性、搜索性//这里选择了高度较高的子树,选取中序遍历与root相邻的节点作为root

root.key =tempNode.key;

delete(tempNode, key);

}

}

}

}returnroot;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值