AVL树
来源:互联网 发布:cs扫描仪软件下载 编辑:程序博客网 时间:2024/05/19 02:31
package avl;/** * Created by long.chen on 2017/12/21. * 平衡二叉树 */public class AVLTree<T extends Comparable<T>> {//泛型 private AVLTreeNode<T> root;//根节点 class AVLTreeNode<T extends Comparable<T>> { T key;//键值 int height;//高度 AVLTreeNode<T> left;//左子树 AVLTreeNode<T> right;//右字树 public AVLTreeNode(T key, AVLTreeNode<T> left, AVLTreeNode<T> right) { this.key = key; this.left = left; this.right = right; this.height = -1;//定义空树的深度为-1 } } public AVLTree() { root = null; } /** * 新建AVL树,或者插入节点->就是new 一个新的节点 然后放置合适的位置进而调节平衡树 */ private AVLTreeNode<T> insert(AVLTreeNode<T> tree, T key) { if (tree == null) { //新建树// System.out.println("新建AVLTree!"); tree = new AVLTreeNode<>(key, null, null); if (tree == null) { System.out.println("创建AVLTree 失败"); return null; } } else { //插入节点 int temp = key.compareTo(tree.key); //temp < 0 ,插入左节点 ;> 0 右节点 ;=0 不添加 if (temp < 0) { tree.left = insert(tree.left, key); if (height(tree.left) - height(tree.right) == 2) {//失衡 if (key.compareTo(tree.left.key) < 0) tree = leftleftRotation(tree); else tree = leftrightRatotion(tree); } } else if (temp == 0) { System.out.println("节点相同,不添加"); } else {// >0 tree.right = insert(tree.right, key); if (height(tree.right) - height(tree.left) == 2) { if (key.compareTo(tree.right.key) > 0) tree = rightrightRotation(tree); else tree = rightleftRaration(tree); } } } tree.height = max(height(tree.left), height(tree.right)) + 1; return tree; } public void insert(T key) { root = insert(root, key); } /** * 删除节点 */ private AVLTreeNode<T> delete(AVLTreeNode<T> tree, AVLTreeNode<T> delteTree) { if (tree == null || delteTree == null) { return null; } int temp = delteTree.key.compareTo(tree.key); if (temp < 0) {//delteTree 在根节点的左侧 tree.left = delete(tree.left, delteTree); if (height(tree.right) - height(tree.left) == 2) { if (height(tree.right.left) > height(tree.right.right)) { tree = rightleftRaration(tree); } else { tree = rightrightRotation(tree); } } } else if (temp > 0) { tree.right = delete(tree.right, delteTree); if (height(tree.left) - height(tree.right) == 2) if (height(tree.left.left) > height(tree.left.right)) tree = leftleftRotation(tree); else tree = leftrightRatotion(tree); } else {//删除的key if (tree.left != null && tree.right != null) { if (height(tree.left) > height(tree.right)) { AVLTreeNode<T> maxTree = maxKey(tree.left); tree.key = maxTree.key; tree.left = delete(tree.left, maxTree); } else { AVLTreeNode<T> minTree = minKey(tree.right); tree.key = minTree.key; tree.right = delete(tree.right, minTree); } } else { AVLTreeNode<T> tmp = tree; tree = (tree.left != null) ? tree.left : tree.right; tmp = null; } } return tree; } public void delete(T key) { AVLTreeNode<T> tree; if ((tree = search(root, key)) != null) root = delete(root, tree); } //打印二叉树 private void printAVLTree(AVLTreeNode<T> tree, T key, int direction) { if (tree != null) { if (direction == 0) { System.out.printf("%2d is root\n", tree.key, key); } else System.out.printf("%2d is %2d's %6s child\n", tree.key, key, direction == 1 ? "right" : "left"); printAVLTree(tree.left, tree.key, -1); printAVLTree(tree.right, tree.key, 1); } } public void printAVLTree() { if (root != null) printAVLTree(root, root.key, 0); } //查找节点 private AVLTreeNode<T> search(AVLTreeNode<T> tree, T key) { if (tree == null) return null; int temp = key.compareTo(tree.key); if (temp < 0) { return search(tree.left, key); } else if (temp > 0) { return search(tree.right, key); } else return tree; } public AVLTreeNode<T> search(T key) { return search(root, key); } //查找AVL最小的节点 private AVLTreeNode<T> minKey(AVLTreeNode<T> tree) { if (tree == null) return null; while (tree.left != null) tree = tree.left; return tree; } public T minKey() { AVLTreeNode<T> treeNode = minKey(root); if (treeNode != null) { return treeNode.key; } return null; } //查找AVL 最大的节点 private AVLTreeNode<T> maxKey(AVLTreeNode<T> tree) { if (tree == null) return null; while (tree.right != null) tree = tree.right; return tree; } public T maxKey() { AVLTreeNode<T> treeNode = maxKey(root); if (treeNode != null) { return treeNode.key; } return null; } //Tree height private int height(AVLTreeNode<T> tree) { if (tree != null) { return tree.height; } return -1; } public int height() { return height(root); } //比较大小 计算高度 public int max(int a, int b) { return a > b ? a : b; } //LL 旋转 k->发生失衡的节点 返回值k1->根节点 private AVLTreeNode<T> leftleftRotation(AVLTreeNode<T> k) { AVLTreeNode<T> k1; k1 = k.left; k.left = k1.right; k1.right = k; k.height = max(height(k.left), height(k.right)) + 1; k1.height = max(height(k1.left), k.height) + 1; return k1; } //RR 旋转 private AVLTreeNode<T> rightrightRotation(AVLTreeNode<T> k) { AVLTreeNode<T> k1; k1 = k.right; k.right = k1.left; k1.left = k; k.height = max(height(k.left), height(k.right)) + 1; k1.height = max(height(k1.right), k.height) + 1; return k1; } //LR旋转 private AVLTreeNode<T> leftrightRatotion(AVLTreeNode<T> k) { AVLTreeNode<T> k1; k.left = rightrightRotation(k.left); k1 = leftleftRotation(k); return k1; } //RL旋转 private AVLTreeNode<T> rightleftRaration(AVLTreeNode<T> k) { AVLTreeNode<T> k1; k.right = leftleftRotation(k.right); k1 = rightrightRotation(k); return k1; } private static int arr[] = {3, 2, 1, 4, 5, 6, 7, 16, 15, 14, 13, 12, 11, 10, 8, 9};//, public static void main(String[] args) { int i; AVLTree<Integer> tree = new AVLTree<Integer>(); System.out.printf("== 依次添加: "); for (i = 0; i < arr.length; i++) { System.out.printf("%d ", arr[i]); tree.insert(arr[i]); } System.out.printf("== 高度: %d\n", tree.height()); tree.printAVLTree(); tree.delete(11);// tree.printAVLTree(); }}
阅读全文
1 0
- AVL树
- AVL树
- AVL树
- avl树
- AVL树
- avl树
- AVL树
- AVL树
- AVL树
- AVL树
- avl树
- avl树
- AVL树
- AVL树
- AVL树
- AVL树
- AVL 树
- AVL树
- rabbitmq简单比较
- [RK3399][Android7.1] 调试笔记 --- 系统使用的zygote.rc文件
- keepalived实现高可用nginx反向代理(Web集群)
- NMEA 183 格式 GPRMC 数据行解析
- ue4c++项目移植问题
- AVL树
- Linux mysql添加用户,删除用户,以及用户权限
- 兼顾pc和移动端的textarea字数监控的实现方法
- linux中ftp查看不到文件列表的问题
- 查询死锁并kill死锁
- Java-使用JavaMail发送一封邮件给用户邮箱功能实现
- 原生js+canvas实现裁剪图片的功能
- NLP成下一个风口?「来也」完成千万美金 B 轮融资,推出战略级AI产品“吾来”
- 收益、规模双双上涨,基金经理痛哭:“年关钱荒”