平衡二叉搜索树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树呢?它有什么 ...
随机推荐
- php上传文件如何保证上传文件不被改变或者乱码
很多网站上传文件都截取文件后缀,前面用时间错加后缀组成,然而一下下载的网站并不需要这样,需要保持原来的文件名,这里讲述一下 //上传操作 function uploadify(){ //var_dum ...
- git stash--在不想commit的情况下进行git pull
公司的git开发模式是“主干发布,分支开发”,大多数情况下是多个开发在同一dev分支上进行开发,因此需要经常pull代码,如果本地工作区存在代码修改,那么pull肯定失败,提示需要先commit已修改 ...
- 全文检索引擎sphinx 与 Elasticsearch 索引速度对比
sphinx的特色之一是建立索引速度快,最近转投Elasticsearch后,一直想做个对比,网上资料常见说法是10倍的差距. 测试环境 硬件:单核,2G内存的E5-2630 虚拟机 操作系统:Cen ...
- win10 中文
按 WinKey+I 鍵,開啟「設定」對話框,再選取「時間與語言」選項.
- python数字图像处理(五) 图像的退化和复原
import cv2 import numpy as np import matplotlib.pyplot as plt import scipy import scipy.stats %matpl ...
- Linux数据库还原备份
Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDBHotbackup的一个很好的替代品. https://www.percon ...
- java之重装系统重新配置环境变量 jdk、eclipse、idea、Oracle、svn、gitlab等环境变量的安装
前言:由于公司电脑进行统一版本升级,需要重装系统(只对C盘做升级),记录一下踩过的坑! 首先理一下思路,看那些东西需要做: 1.jdk及其环境变量 2.eclipse(文件夹版的需要运行项目进行测试) ...
- java object bean 转map
import java.lang.reflect.Field; /** * obj-->map * ConvertObjToMap * 2016年8月17日上午10:53:59 * @param ...
- pycharm html 注释
修改方式:如图修改成值None以后,command+/快捷键,html注释的符号就是<!-- 注释内容 -->:为Jinja2的时候,注释符号就是{# 注释内容 #} 修改成None时,H ...
- 英语单词escapes
escapes 来源 [root@centos7 ~]# help echo echo: echo [-neE] [arg ...] Write arguments to the standard o ...