与BST<> 进行对比

import java.util.ArrayList;
import java.util.Collections;public class Main {public static void main(String[] args) {System.out.println("Pride and Prejudice");ArrayList<String> words = new ArrayList<>();if(FileOperation.readFile("pride-and-prejudice.txt", words)) {System.out.println("Total words: " + words.size());// Collections.sort(words);// Test BSTlong startTime = System.nanoTime();BST<String, Integer> bst = new BST<>();for (String word : words) {if (bst.contains(word))bst.set(word, bst.get(word) + 1);elsebst.add(word, 1);}for(String word: words)bst.contains(word);long endTime = System.nanoTime();double time = (endTime - startTime) / 1000000000.0;System.out.println("BST: " + time + " s");// Test AVL TreestartTime = System.nanoTime();AVLTree<String, Integer> avl = new AVLTree<>();for (String word : words) {if (avl.contains(word))avl.set(word, avl.get(word) + 1);elseavl.add(word, 1);}for(String word: words)avl.contains(word);endTime = System.nanoTime();time = (endTime - startTime) / 1000000000.0;System.out.println("AVL: " + time + " s");}System.out.println();}
}

import java.util.ArrayList;public class AVLTree<K extends Comparable<K>, V> {private class Node{public K key;public V value;public Node left, right;public int height;public Node(K key, V value){this.key = key;this.value = value;left = null;right = null;height = 1;}}private Node root;private int size;public AVLTree(){root = null;size = 0;}public int getSize(){return size;}public boolean isEmpty(){return size == 0;}// 判断该二叉树是否是一棵二分搜索树public boolean isBST(){ArrayList<K> keys = new ArrayList<>();inOrder(root, keys);for(int i = 1 ; i < keys.size() ; i ++)if(keys.get(i - 1).compareTo(keys.get(i)) > 0)return false;return true;}private void inOrder(Node node, ArrayList<K> keys){if(node == null)return;inOrder(node.left, keys);keys.add(node.key);inOrder(node.right, keys);}// 判断该二叉树是否是一棵平衡二叉树public boolean isBalanced(){return isBalanced(root);}// 判断以Node为根的二叉树是否是一棵平衡二叉树,递归算法private boolean isBalanced(Node node){if(node == null)return true;int balanceFactor = getBalanceFactor(node);if(Math.abs(balanceFactor) > 1)return false;return isBalanced(node.left) && isBalanced(node.right);}// 获得节点node的高度private int getHeight(Node node){if(node == null)return 0;return node.height;}// 获得节点node的平衡因子private int getBalanceFactor(Node node){if(node == null)return 0;return getHeight(node.left) - getHeight(node.right);}// 对节点y进行向右旋转操作,返回旋转后新的根节点x//        y                              x//       / \                           /   \//      x   T4     向右旋转 (y)        z     y//     / \       - - - - - - - ->    / \   / \//    z   T3                       T1  T2 T3 T4//   / \// T1   T2private Node rightRotate(Node y) {Node x = y.left;Node T3 = x.right;// 向右旋转过程x.right = y;y.left = T3;// 更新heighty.height = Math.max(getHeight(y.left), getHeight(y.right)) + 1;x.height = Math.max(getHeight(x.left), getHeight(x.right)) + 1;return x;}// 对节点y进行向左旋转操作,返回旋转后新的根节点x//    y                             x//  /  \                          /   \// T1   x      向左旋转 (y)       y     z//     / \   - - - - - - - ->   / \   / \//   T2  z                     T1 T2 T3 T4//      / \//     T3 T4private Node leftRotate(Node y) {Node x = y.right;Node T2 = x.left;// 向左旋转过程x.left = y;y.right = T2;// 更新heighty.height = Math.max(getHeight(y.left), getHeight(y.right)) + 1;x.height = Math.max(getHeight(x.left), getHeight(x.right)) + 1;return x;}// 向二分搜索树中添加新的元素(key, value)public void add(K key, V value){root = add(root, key, value);}// 向以node为根的二分搜索树中插入元素(key, value),递归算法// 返回插入新节点后二分搜索树的根private Node add(Node node, K key, V value){if(node == null){size ++;return new Node(key, value);}if(key.compareTo(node.key) < 0)node.left = add(node.left, key, value);else if(key.compareTo(node.key) > 0)node.right = add(node.right, key, value);else // key.compareTo(node.key) == 0node.value = value;// 更新heightnode.height = 1 + Math.max(getHeight(node.left), getHeight(node.right));// 计算平衡因子int balanceFactor = getBalanceFactor(node);// 平衡维护// LLif (balanceFactor > 1 && getBalanceFactor(node.left) >= 0)return rightRotate(node);// RRif (balanceFactor < -1 && getBalanceFactor(node.right) <= 0)return leftRotate(node);// LRif (balanceFactor > 1 && getBalanceFactor(node.left) < 0) {node.left = leftRotate(node.left);return rightRotate(node);}// RLif (balanceFactor < -1 && getBalanceFactor(node.right) > 0) {node.right = rightRotate(node.right);return leftRotate(node);}return node;}// 返回以node为根节点的二分搜索树中,key所在的节点private Node getNode(Node node, K key){if(node == null)return null;if(key.equals(node.key))return node;else if(key.compareTo(node.key) < 0)return getNode(node.left, key);else // if(key.compareTo(node.key) > 0)return getNode(node.right, key);}public boolean contains(K key){return getNode(root, key) != null;}public V get(K key){Node node = getNode(root, key);return node == null ? null : node.value;}public void set(K key, V newValue){Node node = getNode(root, key);if(node == null)throw new IllegalArgumentException(key + " doesn't exist!");node.value = newValue;}// 返回以node为根的二分搜索树的最小值所在的节点private Node minimum(Node node){if(node.left == null)return node;return minimum(node.left);}// 从二分搜索树中删除键为key的节点public V remove(K key){Node node = getNode(root, key);if(node != null){root = remove(root, key);return node.value;}return null;}private Node remove(Node node, K key){if( node == null )return null;Node retNode;if( key.compareTo(node.key) < 0 ){node.left = remove(node.left , key);// return node;retNode = node;}else if(key.compareTo(node.key) > 0 ){node.right = remove(node.right, key);// return node;retNode = node;}else{   // key.compareTo(node.key) == 0// 待删除节点左子树为空的情况if(node.left == null){Node rightNode = node.right;node.right = null;size --;// return rightNode;retNode = rightNode;}// 待删除节点右子树为空的情况else if(node.right == null){Node leftNode = node.left;node.left = null;size --;// return leftNode;retNode = leftNode;}// 待删除节点左右子树均不为空的情况else{// 找到比待删除节点大的最小节点, 即待删除节点右子树的最小节点// 用这个节点顶替待删除节点的位置Node successor = minimum(node.right);//successor.right = removeMin(node.right);successor.right = remove(node.right, successor.key);successor.left = node.left;node.left = node.right = null;// return successor;retNode = successor;}}if(retNode == null)return null;// 更新heightretNode.height = 1 + Math.max(getHeight(retNode.left), getHeight(retNode.right));// 计算平衡因子int balanceFactor = getBalanceFactor(retNode);// 平衡维护// LLif (balanceFactor > 1 && getBalanceFactor(retNode.left) >= 0)return rightRotate(retNode);// RRif (balanceFactor < -1 && getBalanceFactor(retNode.right) <= 0)return leftRotate(retNode);// LRif (balanceFactor > 1 && getBalanceFactor(retNode.left) < 0) {retNode.left = leftRotate(retNode.left);return rightRotate(retNode);}// RLif (balanceFactor < -1 && getBalanceFactor(retNode.right) > 0) {retNode.right = rightRotate(retNode.right);return leftRotate(retNode);}return retNode;}}

  

public int[] intersect(int[] nums1, int[] nums2) {AVLTree<Integer, Integer> map = new AVLTree<>();for(int num: nums1){if(!map.contains(num))map.add(num, 1);elsemap.add(num, map.get(num) + 1);}ArrayList<Integer> res = new ArrayList<>();for(int num: nums2){if(map.contains(num)){res.add(num);map.add(num, map.get(num) - 1);if(map.get(num) == 0)map.remove(num);}}int[] ret = new int[res.size()];for(int i = 0 ; i < res.size() ; i ++)ret[i] = res.get(i);return ret;}

 

public int uniqueMorseRepresentations(String[] words) {String[] codes = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};AVLTree<String, Object> set = new AVLTree<>();for(String word: words){StringBuilder res = new StringBuilder();for(int i = 0 ; i < word.length() ; i ++)res.append(codes[word.charAt(i) - 'a']);set.add(res.toString(), null);}return set.getSize();}

  AvLMap:

public interface Map<K, V> {void add(K key, V value);boolean contains(K key);V get(K key);void set(K key, V newValue);V remove(K key);int getSize();boolean isEmpty();
}

  

public class AVLMap<K extends Comparable<K>, V> implements Map<K, V> {private AVLTree<K, V> avl;public AVLMap(){avl = new AVLTree<>();}@Overridepublic int getSize(){return avl.getSize();}@Overridepublic boolean isEmpty(){return avl.isEmpty();}@Overridepublic void add(K key, V value){avl.add(key, value);}@Overridepublic boolean contains(K key){return avl.contains(key);}@Overridepublic V get(K key){return avl.get(key);}@Overridepublic void set(K key, V newValue){avl.set(key, newValue);}@Overridepublic V remove(K key){return avl.remove(key);}
}

  

public interface Set<E> {void add(E e);boolean contains(E e);void remove(E e);int getSize();boolean isEmpty();
}

  

public class AVLSet<E extends Comparable<E>> implements Set<E> {private AVLTree<E, Object> avl;public AVLSet(){avl = new AVLTree<>();}@Overridepublic int getSize(){return avl.getSize();}@Overridepublic boolean isEmpty(){return avl.isEmpty();}@Overridepublic void add(E e){avl.add(e, null);}@Overridepublic boolean contains(E e){return avl.contains(e);}@Overridepublic void remove(E e){avl.remove(e);}
}

  

public int[] intersection(int[] nums1, int[] nums2) {AVLSet<Integer> set = new AVLSet<>();for(int num: nums1)set.add(num);ArrayList<Integer> list = new ArrayList<>();for(int num: nums2){if(set.contains(num)){list.add(num);set.remove(num);}}int[] res = new int[list.size()];for(int i = 0 ; i < list.size() ; i ++)res[i] = list.get(i);return res;}

  

public int[] intersect(int[] nums1, int[] nums2) {AVLMap<Integer, Integer> map = new AVLMap<>();for(int num: nums1){if(!map.contains(num))map.add(num, 1);elsemap.add(num, map.get(num) + 1);}ArrayList<Integer> res = new ArrayList<>();for(int num: nums2){if(map.contains(num)){res.add(num);map.add(num, map.get(num) - 1);if(map.get(num) == 0)map.remove(num);}}int[] ret = new int[res.size()];for(int i = 0 ; i < res.size() ; i ++)ret[i] = res.get(i);return ret;}

  

 

转载于:https://www.cnblogs.com/sunliyuan/p/10828251.html

Java 平衡二叉树和AVL相关推荐

  1. avl二叉树 java_平衡二叉树之AVL树(Adelson-Velsky and Landis Tree)简介及Java实现

    平衡二叉树之AVL树(Adelson-Velsky and Landis Tree)简介及Java实现 标签:#二叉树##数据结构##自平衡二叉树# 时间:2018/10/27 09:30:01 作者 ...

  2. 数据结构与算法(java):树-二叉树(二叉查找树(BST)、线索化二叉树、哈夫曼树、平衡二叉树【AVL】、二叉树的前中后序遍历)

    二叉树 1.定义 二叉树 就是度不超过2的树(每个结点最多只有两个子结点).如图 2.特殊二叉树 满二叉树 当二叉树的每一个层的结点树都达到最大值,则这个二叉树就是满二叉树. 完全二叉树 叶结点只能出 ...

  3. 【算法】论平衡二叉树(AVL)的正确种植方法

    参考资料 <算法(java)>                           - - Robert Sedgewick, Kevin Wayne <数据结构>       ...

  4. 20分钟搞定平衡二叉树(AVL树)【超详细】

    文章目录 一.树结构入门 1.什么是树? 2.树结构常用术语 3.二叉搜索树 二.平衡二叉树(AVL树) 1. AVL树简介 2. 失衡二叉排序树的分析与调整 3. 为什么有了平衡树还需要红黑树? 一 ...

  5. 平衡二叉树平衡因子怎么计算_平衡二叉树(AVL Tree)旋转机制分析

    平衡二叉树(AVL Tree) 概述 AVL树是以二分搜索树(BST)为底层数据结构而实现的,其特性是需要维护AVL的|平衡因子| <= 1 平衡因子 对于一个父节点的左右子树高度差的绝对值需要 ...

  6. 二叉搜索树(BST)?平衡二叉树(AVL)?

    二叉搜索树:中序遍历序列是有序的. 二叉查找树,也称有序二叉树,是指一棵空树或者具有以下性质的二叉树: 左子节点的值比父节点小 右子节点的值比父节点大 任意节点的左右字树也分别为二叉查找树 没有键值相 ...

  7. 详解平衡二叉树(AVL),红黑树与平衡二叉树的区别

    目录 1.什么是平衡二叉树 2.平衡二叉树的失衡调整 2.1 左旋 2.2 右旋 3. AVL树的四种插入节点方式 4.平衡二叉树完整代码实现 5.红黑树与平衡二叉树 5.1 红黑树的性质 5.2 旋 ...

  8. 《算法笔记》9.4小节 9.5小节——数据结构专题(2)->二叉查找树(BST)->平衡二叉树(AVL)

    二叉查找树(BST) 问题 A: 二叉排序树 问题描述:输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历. 输入 输入第一行包括一个整数n(1<=n<=100).接下来的一行包括 ...

  9. sheng的学习笔记-平衡二叉树(AVL)和3+4重构

    二叉树细节可参考: sheng的学习笔记-二叉树(BST)_coldstarry的博客-CSDN博客 定义 平衡二叉树,又称AVL树,用于解决二叉排序树高度不确定的情况,如果二叉排序树的子树间的高度相 ...

  10. 【大话数据结构C语言】57 平衡二叉树(AVL树)

    欢迎关注我的公众号是[CodeAllen],关注回复[1024]获取精品学习资源 程序员技术交流①群:736386324 ,程序员技术交流②群:371394777 平衡二叉排序树 平衡二叉树是一种二叉 ...

最新文章

  1. DELL R710 服务器内存排错
  2. entity framework 6 我写了一个公用数据类
  3. 我国网民规模已达7.51亿 但网络安全值得警惕
  4. python3.7.2安装包_Win10下python 2.7与python 3.7双环境安装教程图解
  5. Android中使用EventBus事件发布/订阅框架实现事件传递
  6. maven常识(列表更新中)
  7. node.js安装以及git 的使用说明
  8. getmenuiteminfo无法读取内存_简单科普系列—内存为什么需要组双通道原理及其作用...
  9. 将文件夹下所有csv文件转换成所有txt
  10. 数据结构实验报告——线性表
  11. 机器视觉技术的应用领域
  12. 新书推荐——Linux系统管理与服务器配置
  13. 10个谷歌浏览器调试技巧
  14. 北大方正集团名列2018年中国电子信息百强第8位
  15. 【2022刷题】受伤的皇后
  16. 12月21诛仙服务器维护,12月31日全服停机更新维护公告
  17. 辛普森法 matlab,MATLAB辛普森法则
  18. (手动开o2优化)C++ o2优化用法
  19. 俄罗斯计算机三进制优缺点,为什么我们没有用上三进制的计算机
  20. 袋鼠云数据中台专栏(五):数栈,企业级一站式数据中台PaaS

热门文章

  1. 互联网大厂跳槽鄙视链
  2. ggtech:您有一份来自Airbnb/Google的配色方案需要查收
  3. 谈谈R中的乱码(三)
  4. 空巢青年,“空巢”是选择还是无奈? | 数据告诉你
  5. BZOJ3997 TJOI2015组合数学(动态规划)
  6. 【工具】Sublime Text 自动保存功能
  7. C++ Primer 第五版读书笔记
  8. AngularJS API之toJson 对象转为JSON
  9. FREETEXT FREETEXTTABLE CONTAINS CONTAINSTABLE
  10. PHP错误信息(errors)的屏蔽和显示-设置PHP.ini