平衡二叉搜索树AVL
package com.sunshine.AlgorithmTemplate; import com.sunshine.OFFER66_SECOND.BalanceTreeNode;
import com.sunshine.OFFER66_SECOND.TreeUtility;
import org.junit.Test; public class BalanceTreeTemplate { @Test
public void test() {
insert(5);
insert(2);
insert(3);
insert(4);
insert(1);
insert(6);
insert(7);
insert(0);
insert(8);
delete(5);
delete(6);
delete(3);
} public void insert(int num) {
root = insert(root, num);
TreeUtility.printTreeOfLine(root);
System.out.println("==========");
} public void delete(int num) {
root = deleteNode(root, num);
TreeUtility.printTreeOfLine(root);
System.out.println("==========");
} BalanceTreeNode root = null; private int getTreeHeight(BalanceTreeNode node) {
if (null == node) {
return 0;
}
return node.height;
} private void setTreeHeight(BalanceTreeNode node) {
if (null == node) {
return;
}
int leftHeight = getTreeHeight(node.left);
int rightHeight = getTreeHeight(node.right);
node.height = 1 + (leftHeight > rightHeight ? leftHeight : rightHeight);
} private int getBalanceFactor(BalanceTreeNode node) {
return getTreeHeight(node.left) - getTreeHeight(node.right);
} private int getMaxValue(BalanceTreeNode node){
while(null != node.right){
node = node.right;
}
return node.val;
} private int getMinValue(BalanceTreeNode node){
while(null != node.left){
node = node.left;
}
return node.val;
} private BalanceTreeNode LLRotate(BalanceTreeNode node) {
BalanceTreeNode nodeLC = node.left;
node.left = nodeLC.right;
nodeLC.right = node; setTreeHeight(node);
setTreeHeight(nodeLC);
return nodeLC;
} private BalanceTreeNode RRRotate(BalanceTreeNode node) {
BalanceTreeNode nodeRC = node.right;
node.right = nodeRC.left;
nodeRC.left = node; setTreeHeight(node);
setTreeHeight(nodeRC);
return nodeRC;
} private BalanceTreeNode LRRotate(BalanceTreeNode node) {
node.left = RRRotate(node.left);
return LLRotate(node);
} private BalanceTreeNode RLRotate(BalanceTreeNode node) {
node.right = LLRotate(node.right);
return RRRotate(node);
} public BalanceTreeNode insert(BalanceTreeNode cur, int val) {
if (null == cur) {
return new BalanceTreeNode(val);
}
if (val < cur.val) {
cur.left = insert(cur.left, val);
} else if (val > cur.val) {
cur.right = insert(cur.right, val);
} else {
return cur;
} return adjust(cur,val);
} private BalanceTreeNode adjust(BalanceTreeNode cur,int val){
if(null == cur){
return cur;
}
setTreeHeight(cur);
int balanceFactor = getBalanceFactor(cur);
if (balanceFactor < -1) {
//RR
if (val > cur.right.val) {
return RRRotate(cur);
}
//RL
else {
return RLRotate(cur);
}
}
if (balanceFactor > 1) {
//LL
if (val < cur.left.val) {
return LLRotate(cur);
}
//LR
else {
return LRRotate(cur);
}
}
return cur;
} public BalanceTreeNode deleteNode(BalanceTreeNode cur, int val) {
if (cur == null) {
return cur;
}
if (val < cur.val) {
cur.left = deleteNode(cur.left,val);
}else if(val>cur.val){
cur.right = deleteNode(cur.right,val);
}else{
BalanceTreeNode tmp = cur;
if(null == cur.left && null == cur.right){
cur = null;
}else if(null == cur.left){
cur = cur.right;
}else if(null == cur.right){
cur = cur.left;
}else {
if(getBalanceFactor(cur)>=0){
int remVal = getMaxValue(cur.left);
cur.val = remVal;
cur.left = deleteNode(cur.left, remVal);
}else{
int remVal = getMinValue(cur.right);
cur.val = remVal;
cur.right = deleteNode(cur.right, remVal);
}
}
} return adjust(cur,val);
}
}
平衡二叉搜索树AVL的更多相关文章
- 看动画学算法之:平衡二叉搜索树AVL Tree
目录 简介 AVL的特性 AVL的构建 AVL的搜索 AVL的插入 AVL的删除 简介 平衡二叉搜索树是一种特殊的二叉搜索树.为什么会有平衡二叉搜索树呢? 考虑一下二叉搜索树的特殊情况,如果一个二叉搜 ...
- 平衡二叉搜索树/AVL二叉树 C实现
//AVTree.h #ifndef MY_AVLTREE_H #define MY_AVLTREE_H typedef int ElementType; struct TreeNode { Elem ...
- 二叉搜索树、AVL平衡二叉搜索树、红黑树、多路查找树
1.二叉搜索树 1.1定义 是一棵二叉树,每个节点一定大于等于其左子树中每一个节点,小于等于其右子树每一个节点 1.2插入节点 从根节点开始向下找到合适的位置插入成为叶子结点即可:在向下遍历时,如果要 ...
- 手写AVL平衡二叉搜索树
手写AVL平衡二叉搜索树 二叉搜索树的局限性 先说一下什么是二叉搜索树,二叉树每个节点只有两个节点,二叉搜索树的每个左子节点的值小于其父节点的值,每个右子节点的值大于其左子节点的值.如下图: 二叉搜索 ...
- 树-二叉搜索树-AVL树
树-二叉搜索树-AVL树 树 树的基本概念 节点的度:节点的儿子数 树的度:Max{节点的度} 节点的高度:节点到各叶节点的最大路径长度 树的高度:根节点的高度 节点的深度(层数):根节点到该节点的路 ...
- convert sorted list to binary search tree(将有序链表转成平衡二叉搜索树)
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- 算法:非平衡二叉搜索树(UnBalanced Binary Search Tree)
背景 很多场景下都需要将元素存储到已排序的集合中.用数组来存储,搜索效率非常高: O(log n),但是插入效率比较低:O(n).用链表来存储,插入效率和搜索效率都比较低:O(n).如何能提供插入和搜 ...
- LeetCode 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树
第108题 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10 ...
- 高度平衡的二叉搜索树(AVL树)
AVL树的基本概念 AVL树是一种高度平衡的(height balanced)二叉搜索树:对每一个结点x,x的左子树与右子树的高度差(平衡因子)至多为1. 有人也许要问:为什么要有AVL树呢?它有什么 ...
随机推荐
- bootstrap-select、datatables插件使用
1.引入样式文件 <%--引入bootstrap_select样式--%> <link rel="stylesheet" type="text/css& ...
- [已解决]报错: Error response from daemon: conflict
报错内容: Error response from daemon: conflict: unable to delete f5b6ef70d79b (must be forced) - image i ...
- 《剑指offer》面试题7 用两个栈实现队列 Java版
书中方法:队列是先进先出的,栈是先进后出的,试想把一串数压入A栈,接着一个个出栈并压入B栈,便会完成"头在下"到"头在上"的转变.B栈内还有元素时,直接出栈表示 ...
- P2639 [USACO09OCT]Bessie的体重问题Bessie's Weight
题目传送门 这题和01背包最大的区别在于它没有价值,所以我们可以人工给它赋一个价值,由于要求体积最大,把价值赋成体积即可.顺带一提,这题数据范围很大,二维会MLE,要压缩成一维才可以AC 下面给出参考 ...
- 修改ps工具栏字体大小
修改ps工具栏字体大小 先改电脑分辨率或者改首选项--界面---文字,退出后,重新打开,但你会发现问题还是没解决,我们接着往下 找到文件夹安装目录下的photoshops.exe启动文件(查找方法 ...
- 1. ZooKeeper简介
1. ZooKeeper是什么 ZooKeeper致力于提供一个高性能.高可用,且具备严格的顺序访问控制能力的分布式协调服务,是雅虎公司创建,是Google的Chubby一个开源的实现,也是Hadoo ...
- 微信小程序(2)--下拉刷新和上拉加载更多
下拉刷新 1.首先在.json文件中配置(如果在app.json文件中配置,那么整个程序都可以下拉刷新.如果写在具体页面的.json文件中,那么就是对应的页面下拉刷新.) 具体页面的.json文件: ...
- 【抓包工具之Fiddler】增加IP列;session高亮
Fiddler 在处理每个session时,脚本文件CustomRules.js中的方法都会运行,该脚本使得你可以隐藏,标识或任意修改负责的session.规则脚本在运行状态下就可以修改并重新编译,不 ...
- Linux 给用户 赋某个文件夹操作的权限
https://my.oschina.net/cqyj/blog/1796047 在root用户登录的情况,赋予opt目录给liuhai这个用户权限 示例代码: # 将目录/opt 及其下面的所有文件 ...
- pipelines和重定向命令
pipelines: command1 | command2 例如,ls -l /usr/bin | less,将输出结果作为 less 命令的输入结果,在standard output 中显示出来. ...