package data.avl;
import data.linkliststruct.LinkedListQueue;
import data.map.BinarySearchTreeMap;
import data.map.Map;
import java.util.ArrayList;
import java.util.Stack;
/**
* @Author: liyuzhan
* @classDesp: 平衡二叉树(加上自平衡机制)
* @Date: 2020/3/10 10:08
* @Email: 1031759184@qq.com
*/
public class AVLTree<K extends Comparable<K>, V> implements Map<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;
}
@Override
public void add(K key, V value) {
root = add(root, 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 {
node.value = value;
}
//更新height
node.height = 1 + Math.max(getHeight(node.left), getHeight(node.right));
//计算平衡因子
int balanceFactor = getBalanceFactor(node);
//平衡维护
//右旋转LL
if (balanceFactor > 1 && getBalanceFactor(node.left) >= 0) {
return rightRotate(node);
}
//左旋转RR
if (balanceFactor < -1 && getBalanceFactor(node.right) <= 0) {
return leftRotate(node);
}
//先左旋再右旋 LR
if (balanceFactor > 1 && getBalanceFactor(node.left) < 0) {
node.left = leftRotate(node.left);
return rightRotate(node);
}
//先右旋再左旋 RL
if (balanceFactor < -1 && getBalanceFactor(node.right) > 0) {
node.right = rightRotate(node.right);
return leftRotate(node);
}
return node;
}
@Override
public V remove(K key) {
Node node = getNode(root, key);
if (node != null) {
root = remove(root, key);
return node.value;
}
return null;
}
private Node minimum(Node node) {
if (node.left == null) {
return node;
}
return minimum(node.left);
}
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);
retNode = node;
} else if (key.compareTo(node.key) > 0) {
node.right = remove(node.right, key);
retNode = node;
} else {
if (node.left == null) {
Node rightNode = node.right;
node.right = null;
size--;
retNode = rightNode;
}
if (node.right == null) {
Node leftNode = node.left;
node.left = null;
size--;
retNode = leftNode;
}
//待删除节点左右子树均不为空
//找到比待删除节点大的最小节点(后继节点),即待删除节点右子树的最小节点
//用这个节点顶替待删除节点的位置
else {
Node successor = minimum(node.right);
successor.right = remove(node.right, successor.key);
successor.left = node.left;
node.left = node.right = null;
retNode = successor;
}
}
if (retNode == null) {
return null;
}
//更新height
retNode.height = 1 + Math.max(getHeight(retNode.left), getHeight(retNode.right));
//计算平衡因子
int balanceFactor = getBalanceFactor(retNode);
//平衡维护
//右旋转LL
if (balanceFactor > 1 && getBalanceFactor(retNode.left) >= 0) {
return rightRotate(retNode);
}
//左旋转RR
if (balanceFactor < -1 && getBalanceFactor(retNode.right) <= 0) {
return leftRotate(retNode);
}
//先左旋再右旋 LR
if (balanceFactor > 1 && getBalanceFactor(retNode.left) < 0) {
retNode.left = leftRotate(retNode.left);
return rightRotate(retNode);
}
//先右旋再左旋 RL
if (balanceFactor < -1 && getBalanceFactor(retNode.right) > 0) {
retNode.right = rightRotate(retNode.right);
return leftRotate(retNode);
}
return retNode;
}
private Node removeMin(Node node) {
if (node.left == null) {
Node rightNode = node.right;
node.right = null;
size--;
return rightNode;
}
node.left = removeMin(node.left);
return node;
}
@Override
public boolean contain(K key) {
return getNode(root, key) != null;
}
@Override
public V get(K key) {
Node node = getNode(root, key);
return node == null ? null : node.value;
}
private Node getNode(Node node, K key) {
if (node == null) {
return null;
}
if (key.compareTo(node.key) == 0) {
return node;
} else if (key.compareTo(node.key) < 0) {
return getNode(node.left, key);
} else {
return getNode(node.right, key);
}
}
@Override
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;
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
/**
* 返回节点所对应的高度值
*
* @param node 传入的节点
* @return 高度值
*/
private int getHeight(Node node) {
if (node == null) {
return 0;
}
return node.height;
}
/**
* 计算节点的平衡因子
*
* @param node 传入节点
* @return 平衡因子
*/
private int getBalanceFactor(Node node) {
if (node == null) {
return 0;
}
return getHeight(node.left) - getHeight(node.right);
}
/**
* 判断该二叉树是否是一颗二分搜索树
*
* @return 是否是二分搜索树
*/
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;
}
/**
* 二叉树中序遍历
*
* @param node 当前节点
* @param keys 获取中序遍历后的键的数组
*/
private void inOrder(Node node, ArrayList<K> keys) {
if (node == null) {
return;
}
inOrder(node.left, keys);
keys.add(node.key);
inOrder(node.right, keys);
}
/**
* 判断该二叉树是否是一颗AVL树
*
* @return 是否是一颗AVL树
*/
public boolean isBalanced() {
return isBalanced(root);
}
/**
* 判断该节点为根的二叉树是否是一颗AVL树,递归算法
*
* @param node 当前节点
* @return 是否是一颗AVL树
*/
private boolean isBalanced(Node node) {
if (node == null) {
return true;
}
没有合适的资源?快使用搜索试试~ 我知道了~
数据结构和部分算法题解.zip
共210个文件
java:180个
xml:5个
md:4个
需积分: 2 0 下载量 144 浏览量
2024-01-14
12:43:01
上传
评论
收藏 180KB ZIP 举报
温馨提示
算法与数据结构它们分别涵盖了以下主要内容: 数据结构(Data Structures): 逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
资源推荐
资源详情
资源评论
收起资源包目录
数据结构和部分算法题解.zip (210个子文件)
equals 628B
.gitignore 38B
.gitignore 8B
HashMap 835B
datastruct.iml 423B
AVLTree.java 10KB
BinarySearchTree.java 9KB
RedBlackTree.java 6KB
Array.java 6KB
LFUCache.java 6KB
LinkedList.java 5KB
SegmentTree.java 5KB
Twitter.java 5KB
Solution1.java 4KB
BinarySearchTreeMap.java 4KB
MaxHeap.java 4KB
Solution2.java 3KB
Solution10.java 3KB
Solution28.java 3KB
Solution1.java 2KB
LinkedListMap.java 2KB
Solution.java 2KB
NumArray.java 2KB
LoopQueue.java 2KB
Solution4.java 2KB
Solution.java 2KB
Solution2.java 2KB
LinkedListQueue.java 2KB
MaxQueue.java 2KB
UnionFind5.java 2KB
SimpleHashMap.java 2KB
Trie.java 2KB
UnionFind6.java 2KB
Solution16.java 2KB
Solution.java 2KB
UnionFind4.java 2KB
Solution4.java 2KB
Solution2.java 2KB
Solution6.java 2KB
Solution13.java 2KB
Solution10.java 2KB
Solution3.java 2KB
WordDictionary.java 2KB
UnionFind3.java 2KB
LRUCache.java 2KB
Solution4.java 2KB
Solution1.java 2KB
MyStack.java 2KB
TrieSolution.java 2KB
Solution13.java 2KB
Solution8.java 2KB
Solution3.java 2KB
Solution3.java 2KB
Solution5.java 2KB
Solution1.java 2KB
Solution1.java 2KB
Solution24.java 2KB
Solution6.java 2KB
Solution9.java 2KB
Solution2.java 2KB
Main.java 2KB
Solution17.java 2KB
Solution21.java 2KB
UnionFind2.java 2KB
Solution2.java 2KB
Solution5.java 2KB
Solution7.java 1KB
Solution2.java 1KB
Solution3.java 1KB
MergeSort.java 1KB
Solution14.java 1KB
Solution3.java 1KB
MapSum.java 1KB
Solution4.java 1KB
Solution6.java 1KB
ArrayQueue.java 1KB
Solution9.java 1KB
Solution8.java 1KB
Solution11.java 1KB
Solution6.java 1KB
ArrayStack.java 1KB
Solution2.java 1KB
Solution.java 1KB
Main1.java 1KB
Solution7.java 1KB
Main.java 1KB
Main.java 1KB
Main.java 1KB
MapEntry.java 1KB
Solution4.java 1KB
Solution11.java 1KB
Solution.java 1KB
Solution2.java 1KB
Solution.java 1KB
Solution22.java 1KB
Solution3.java 1KB
Main.java 1KB
Solution4.java 1KB
UnionFind1.java 1KB
BracketMatch.java 1KB
共 210 条
- 1
- 2
- 3
资源评论
极致人生-010
- 粉丝: 4399
- 资源: 3086
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功