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. 方法重载(overload)与方法重写(override)

    一.方法重载: 在同一个类中,允许存在一个及以上的同名方法,只要他们的参数列表不同(参数的个数或者参数的类型不同)即可.注意方法重载与返回值类型.访问权限修饰符.和抛出的异常无关.重载是在本类中,与继 ...

  2. Codeforces 1119C(思维)

    题面 传送门 分析 这种题的重点是寻找不变量 我们发现如果改变4个角,则每一行和每一列的xor和不会改变(1^0=0^1) 所以只要算出异或和然后比较就可以 代码 #include<iostre ...

  3. P3452 [POI2007]BIU-Offices(链表+bfs)

    P3452 [POI2007]BIU-Offices 新姿势:链表存图快速删除 显然两个没有直接相连的点要放到同一个集合里 但是直接搞一个图的补图会挂掉 考虑用链表维护点序列 每次bfs删除一个点和与 ...

  4. JVM(5)之 GC之标记

    开发十年,就只剩下这套架构体系了! >>>     堆分为年轻代和年老代.永久代是非堆内存,它又叫做方法区(一般的说法),主要存储已被加载的类信息.常量.静态变量.而该区域在java ...

  5. 源码分析--ArrayList(JDK1.8)

    ArrayList是开发常用的有序集合,底层为动态数组实现.可以插入null,并允许重复. 下面是源码中一些比较重要属性: 1.ArrayList默认大小10. /** * Default initi ...

  6. parse_str()和http_build_query()的使用

    <?php $_html = array(); $_html['action1'] = 'action1'; $_html['action2'] = 'action2'; echo http_b ...

  7. Vue-native绑定原生事件

    首先介绍一下是什么意思: 意思就是当你给一个vue组件绑定事件时候,要加上native!如果是普通的html元素!就不需要 <div id = "app"> <m ...

  8. centos7安装nginx并配置web前端环境。

    1.安装nginx -sudo yum install nginx 2.启动nginx - systemctl start nginx 3.修改nginx路径配置,/etc/nginx/nginx.c ...

  9. Microsoft REST API指南

    序言 经过3个月的碎片时间的翻译和校验,由长沙.NET技术社区翻译的英文原文文档<Microsoft REST API指南>已经翻译完成,现刊载前十一章如下,欢迎大家点击"查看原 ...

  10. 一个简单的JSP 连接MySQL使用实例

    一.软件环境 下载并安装MySQL,Tomacat,JDBC.MyEclipse或其他IDE. 二.环境配置 将其环境变量配置好之后,下载Java 专用的连接MySQL的驱动包JDBC,有人会发现在一 ...