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的更多相关文章

  1. 看动画学算法之:平衡二叉搜索树AVL Tree

    目录 简介 AVL的特性 AVL的构建 AVL的搜索 AVL的插入 AVL的删除 简介 平衡二叉搜索树是一种特殊的二叉搜索树.为什么会有平衡二叉搜索树呢? 考虑一下二叉搜索树的特殊情况,如果一个二叉搜 ...

  2. 平衡二叉搜索树/AVL二叉树 C实现

    //AVTree.h #ifndef MY_AVLTREE_H #define MY_AVLTREE_H typedef int ElementType; struct TreeNode { Elem ...

  3. 二叉搜索树、AVL平衡二叉搜索树、红黑树、多路查找树

    1.二叉搜索树 1.1定义 是一棵二叉树,每个节点一定大于等于其左子树中每一个节点,小于等于其右子树每一个节点 1.2插入节点 从根节点开始向下找到合适的位置插入成为叶子结点即可:在向下遍历时,如果要 ...

  4. 手写AVL平衡二叉搜索树

    手写AVL平衡二叉搜索树 二叉搜索树的局限性 先说一下什么是二叉搜索树,二叉树每个节点只有两个节点,二叉搜索树的每个左子节点的值小于其父节点的值,每个右子节点的值大于其左子节点的值.如下图: 二叉搜索 ...

  5. 树-二叉搜索树-AVL树

    树-二叉搜索树-AVL树 树 树的基本概念 节点的度:节点的儿子数 树的度:Max{节点的度} 节点的高度:节点到各叶节点的最大路径长度 树的高度:根节点的高度 节点的深度(层数):根节点到该节点的路 ...

  6. 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 ...

  7. 算法:非平衡二叉搜索树(UnBalanced Binary Search Tree)

    背景 很多场景下都需要将元素存储到已排序的集合中.用数组来存储,搜索效率非常高: O(log n),但是插入效率比较低:O(n).用链表来存储,插入效率和搜索效率都比较低:O(n).如何能提供插入和搜 ...

  8. LeetCode 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树

    第108题 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10 ...

  9. 高度平衡的二叉搜索树(AVL树)

    AVL树的基本概念 AVL树是一种高度平衡的(height balanced)二叉搜索树:对每一个结点x,x的左子树与右子树的高度差(平衡因子)至多为1. 有人也许要问:为什么要有AVL树呢?它有什么 ...

随机推荐

  1. CentOS删除Applications中的菜单项

    有时候会错误的安装一些软件,可能安装被不成功,但是在左上角的Applications菜单中还是会显示出来,让人很不爽. 现在介绍一个删除掉CentOS Applications中菜单项的方法: 1.安 ...

  2. Linux服务器安全配置小结(转)

    众所周知,网络安全是一个非常重要的课题,而服务器是网络安全中最关键的环节.Linux被认为是一个比较安全的Internet服务器,作为一种开放源代码操作系统,一旦Linux系统中发现有安全漏洞,Int ...

  3. Tensorflow机器学习入门——MINIST数据集识别

    参考网站:http://www.tensorfly.cn/tfdoc/tutorials/mnist_beginners.html #自动下载并加载数据 from tensorflow.example ...

  4. python学习第十六天集合的关系测试

    在做数据分析的时候,要对一个集合分析,而且分析多个集合的之间的关系分析,那么用传统的循环的比较麻烦,集合提供很多方法,很容易比较多个集合的关系,并集,交集,差集,对称差集等. n1={1,2,4,6} ...

  5. 如何判断元素是否在可视区域内--getBoundingClientRect

    介绍 Element.getBoundingClientRect()方法返回元素的大小及其相对于视口的位置. 根据MDN文档 getBoundingClientRect 方法返回的是一个DOMRect ...

  6. windows使用ubuntu启动linux服务

    有些服务只能在linux中策马奔腾,但是公司配置windows电脑,因此在windows中安装ubuntu服务,再在启动的ubuntu中启动linux服务 系统:win10(其他系统没试过) 安装步骤 ...

  7. 02.LNMP架构-MySQL源码包编译部署详细步骤

    操作系统:CentOS_Server_7.5_x64_1804.iso 部署组件:Cmake+Boost+MySQL 操作步骤: 一.安装依赖组件 [root@localhost ~]# yum -y ...

  8. Linux学习笔记之档案权限与目录配置

    一. 档案权限与目录配置用户的属性信息: /etc/passwd用户的密码信息: /etc/shadow组的信息:     /etc/group 每个用户都有唯一的UID供系统识别sudo -i 输入 ...

  9. pip命令一般使用

    pip类似RedHat里面的yum,安装Python包非常方便.本节详细介绍pip的安装.以及使用方法. 1.pip下载安装 1.1 pip下载   1 # wget "https://py ...

  10. 在IDEA中如何将Spring boot项目打包成可执行的jar包并发布到linux服务

    这两年微服务很流行,这里简单介绍一下如何将自己使用idea写的微服务打包成一个可执行的jar包,并发布到linux服务器的步骤.因为spring boot有内置的tomcat所以一般使用内置的tomc ...