java项目---用java实现二叉平衡树(AVL树)并打印结果(详)(3星)
package Demo; public class AVLtree {
private Node root; //首先定义根节点 private static class Node{ //定义Node指针参数
private int key; //节点
private int balance; //平衡值
private int height; //树的高度
private Node left; //左节点
private Node right; //右节点
private Node parent; //父母节点 Node(int key, Node parent){ //构造器中引用该构造器正在初始化的对象
this.key = key;
this.parent = parent; }
}
public boolean insert(int key){ //判断这里是否能插入新的节点
if(root == null){
root = new Node(key,null);
return true;
} Node n = root;
while (true){ //如果根节点下的子节点和新插进来的子节点相同
if(n.key == key)
return false; //则不进行插入操作 Node parent = n; boolean goLeft = n.key > key; //判断新的节点插入父母节点的左边or右边
n = goLeft ? n.left : n.right; //小的话插左边,大的话插右边 if(n == null){
if(goLeft){
parent.left = new Node (key,parent);
}else{
parent.right = new Node(key,parent);
}
rebalance(parent);
break;
}
}
return true;
} private void delete(Node node){ //删除节点
if(node.left == null && node.right == null){
if(node.parent == null){
root = null;
}else{
Node parent = node.parent;
if(parent.left == node){ //如果父母节点的左孩子节点和根节点一样
parent.left = null; //则左节点为空
}else{
parent.right = null; //反之右节点为空
}
rebalance(parent);
}
return ;
} if(node.left != null){ //如果左节点不空
Node child = node.left;
while(child.right != null)child = child.right;
node.key = child.key;
delete(child);
}else{
Node child = node.right;
while (child.left != null)child = child.left;
node.key = child.key;
delete(child);
}
} public void Delete(int delKey){
if(root == null)
return; Node child = root;
while (child != null){
Node node = child; //交换根节点给node , 再判断新的孩子节点插在哪里
child = delKey >= node.key ? node.right : node.left;
if(delKey == node.key){
delete(node);
return;
}
}
} private void setBalance(Node... nodes){
for(Node n : nodes){
reheight(n);
n.balance = height(n.right) - height(n.left); //平衡因子,任意节点左右子树高度差
}
} private void rebalance (Node n){
setBalance(n); if(n.balance == -2){
if(height(n.left.left) >= height(n.left.right))
n = rotateRight(n);
else
n = rotateLeftThenRight(n) ; }else if(n.balance == 2){ //等于2和-2都是不平衡的,需要重新调整
if(height(n.right.right) >= height(n.right.left))
n = rotateLeft(n);
else
n = rotateRightThenLeft(n); } if(n.parent != null){
rebalance(n.parent);
}else{
root = n;
}
} private Node rotateLeft(Node a){ Node b = a.right;
b.parent = a.parent; a.right = b.left; if(a.right != null)
a.right.parent = a; b.left = a;
a.parent = b; if(b.parent != null){
if(b.parent.right == a){
b.parent.right = b;
}else{
b.parent.left = b;
}
} setBalance(a, b); return b;
} private Node rotateRight(Node a){ Node b = a.left;
b.parent = a.parent; a.left = b.right; if(a.left != null){
a.left.parent = a; b.right = a;
a.parent = b; if(b.parent.right == a){
b.parent.right = b;
}else{
b.parent.left = b;
}
} setBalance(a, b); return b;
} private Node rotateLeftThenRight(Node n){
n.left = rotateLeft(n.left);
return rotateRight(n);
} private Node rotateRightThenLeft(Node n){
n.right = rotateRight(n.right);
return rotateLeft(n);
} private int height (Node n){
if(n == null)
return -1;
return n.height;
} public void printBalance(){
printBalance(root);
} private void printBalance(Node n){
if(n != null){
printBalance(n.left);
System.out.printf("%s ",n.balance);
printBalance(n.right);
}
} private void reheight(Node node){
if(node != null){
node.height = 1 + Math.max(height(node.left),height(node.right)); //新的二叉平衡树高度为:
}
}
public static void main(String[] args) {
AVLtree tree = new AVLtree(); System.out.println("Inserting values 1 to 10"); //最后输出的结果代表平衡因子,0为左右子树高度相等,1为左右子树高度相差1层
for (int i = 1; i < 10; i++)
tree.insert(i); System.out.println("Print balance : ");
tree.printBalance();
}
}
可以动手画一下生成的AVL树,亲测算法符合结果。
java项目---用java实现二叉平衡树(AVL树)并打印结果(详)(3星)的更多相关文章
- (4) 二叉平衡树, AVL树
1.为什么要有平衡二叉树? 上一节我们讲了一般的二叉查找树, 其期望深度为O(log2n), 其各操作的时间复杂度O(log2n)同时也是由此决定的.但是在某些情况下(如在插入的序列是有序的时候), ...
- Algorithms: 二叉平衡树(AVL)
二叉平衡树(AVL): 这个数据结构我在三月份学数据结构结构的时候遇到过.但当时没调通.也就没写下来.前几天要用的时候给调好了!详细AVL是什么,我就不介绍了,维基百科都有. 后面两月又要忙了. ...
- 树-二叉搜索树-AVL树
树-二叉搜索树-AVL树 树 树的基本概念 节点的度:节点的儿子数 树的度:Max{节点的度} 节点的高度:节点到各叶节点的最大路径长度 树的高度:根节点的高度 节点的深度(层数):根节点到该节点的路 ...
- 二叉平衡树AVL的插入与删除(java实现)
二叉平衡树 全图基础解释参考链接:http://btechsmartclass.com/data_structures/avl-trees.html 二叉平衡树:https://www.cnblogs ...
- 高度平衡的二叉搜索树(AVL树)
AVL树的基本概念 AVL树是一种高度平衡的(height balanced)二叉搜索树:对每一个结点x,x的左子树与右子树的高度差(平衡因子)至多为1. 有人也许要问:为什么要有AVL树呢?它有什么 ...
- 树-二叉平衡树AVL
基本概念 AVL树:树中任何节点的两个子树的高度最大差别为1. AVL树的查找.插入和删除在平均和最坏情况下都是O(logn). AVL实现 AVL树的节点包括的几个组成对象: (01) key -- ...
- 各种查找算法的选用分析(顺序查找、二分查找、二叉平衡树、B树、红黑树、B+树)
目录 顺序查找 二分查找 二叉平衡树 B树 红黑树 B+树 参考文档 顺序查找 给你一组数,最自然的效率最低的查找算法是顺序查找--从头到尾挨个挨个遍历查找,它的时间复杂度为O(n). 二分查找 而另 ...
- AVL树(二叉平衡树)详解与实现
AVL树概念 前面学习二叉查找树和二叉树的各种遍历,但是其查找效率不稳定(斜树),而二叉平衡树的用途更多.查找相比稳定很多.(欢迎关注数据结构专栏) AVL树是带有平衡条件的二叉查找树.这个平衡条件必 ...
- 判断一颗二叉树是否为二叉平衡树 python 代码
输入一颗二叉树,判断这棵树是否为二叉平衡树.首先来看一下二叉平衡树的概念:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.因此判断一颗二叉平衡树的关键在于 ...
随机推荐
- Mysql 源码:关于innodb中两次写的探索
转载自:http://www.cnblogs.com/bamboos/p/3553703.html?utm_source=tuicool&utm_medium=referral 两次写可以说是 ...
- 实训任务05 MapReduce获取成绩表的最高分记录
实训任务05 MapReduce获取成绩表的最高分记录 实训1:统计用户纺问次数 任务描述: 统计用户在2016年度每个自然日的总访问次数.原始数据文件中提供了用户名称与访问日期.这个任务就是要获取 ...
- HTML网页音频控制
// 音频播放function playSound(url) { var borswer = window.navigator.userAgent.toLowerCase(); var audio; ...
- 解决安装虚拟环境出现的问题(OSError: Command /home/python/.virtua...ngo3_web/bin/python3 - setuptools pkg_resources pip wheel failed with error code 2)
python3的报错解决: OSError: Command /home/python/.virtua...ngo3_web/bin/python3 - setuptools pkg_resource ...
- WINDOWS SERVER 2016 IE使用FLASH PLAYER的方法
Windows Server 2016出于安全的考虑,默认禁用了Flash Player.把Windows Server 2016作为日常操作系统的童鞋会发现,IE里完全没有Flash Player这 ...
- 软件测试人员必备网络知识(一):什么是cookie?
初入职场的新人,是不是经常会被一些基础的网络知识难住,又不敢问老大,只好默默的百度?纳,我花一个星期的加班时间,把这些经常要用到的网络知识点给整理出来了!这是一个系列的,如果对你们有用,后续还会继续 ...
- undo系统参数详解
查看与undo相关的系统参数 1.undo_management 有两个参数值:auto.manual(默认) manual:系统启动后使用rollback segment存储undo信息: auto ...
- elasticsearch(1) 安装和使用
一.简介 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. 但是 ...
- [RESTful] 设计要素
如何设计RESTful API 资源路径(入何规划资源路径) HTTP动词(请求方式 GET/POST...) 过滤信息(分页,查询操作的时候进行信息过滤) 状态码(服务器端响应什么样的状态码) 错误 ...
- Java学习NO.4
学习内容如下: 数组的概述与特征 概述: 它是具有相同数据类型的一组数据的集合 存储在数组中的数据我们称之为数组元素,可通过“数组名[下标]”的方式进行访问,下标也就是索引,从0开始,且负数索引是无效 ...