数据结构——二叉查找树、AVL树
二叉查找树:由于二叉查找树建树的过程即为插入的过程,所以其中序遍历一定为升序排列!
插入:直接插入,插入后一定为根节点
查找:直接查找
删除:叶子节点直接删除,有一个孩子的节点删除后将孩子节点接入到父节点即可,有两个孩子的节点,将左儿子最右边节点(或右儿子最左边节点)替换到根节点即可。
AVL树(二叉平衡查找树)
定义:节点的平衡度(左子树的高度 - 右子树的高度)只能为-1、0、1的二叉查找树。
创建:需要一个变量记录每个节点的平衡度
查找:直接查找
插入:LL、LR、RL、RR过程
删除:分情况讨论
AVL树的Java实现:
package com.tonyluis; /**
* AVL树
*
* @author TonyLuis 2016.07.27
* @param <T>
*/
public class AVLTree<T extends Comparable<T>> {
private AVLNode<T> root; @SuppressWarnings("hiding")
class AVLNode<T> {
T val;
AVLNode<T> left;
AVLNode<T> right;
int height; AVLNode(T val, AVLNode<T> left, AVLNode<T> right) {
this.val = val;
this.left = left;
this.right = right;
this.height = 0;
}
} public void insert(T num) {
root = insert(num, root);
} public void remove(T num) {
remove(num, root);
} public boolean find(T num) {
AVLNode<T> t = this.root;
while (t != null && num.compareTo(t.val) != 0)
t = num.compareTo(t.val) > 0 ? t.right : t.left;
if (t == null)
return false;
else
return true;
} private int height(AVLNode<T> node) {
return node == null ? -1 : node.height;
} private AVLNode<T> insert(T num, AVLNode<T> root) {
// root==null 找到了插入的位置
if (root == null)
return new AVLNode<T>(num, null, null); int compareResult = num.compareTo(root.val);
if (compareResult < 0) {// 插入左子树
root.left = insert(num, root.left);
if (height(root.left) - height(root.right) == 2) {
if (num.compareTo(root.left.val) < 0)
root = LL(root);
else
root = LR(root);
}
} else if (compareResult > 0) {
root.right = insert(num, root.right);
if (height(root.right) - height(root.left) == 2) {
if (num.compareTo(root.right.val) < 0)
root = RL(root);
else
root = RR(root);
}
}
root.height = Math.max(height(root.left), height(root.right)) + 1;
return root;
} public boolean remove(T num, AVLNode<T> root) {
boolean isStop = false;
boolean isLeftSubTree;
if (root == null)
return true;
int compareResult = num.compareTo(root.val);
if (compareResult < 0) {
isStop = remove(num, root.left);
isLeftSubTree = true;
} else if (compareResult > 0) {
isStop = remove(num, root.right);
isLeftSubTree = false;
} else if (root.left == null || root.right == null) {
root = root.left == null ? root.right : root.left;
return false;
} else {// 找到且有两个子树,将其和右子树最左边节点交换,然后在右子树执行删除操作
AVLNode<T> tmp = root.right;
while (tmp.left != null)
tmp = tmp.left;
root.val = tmp.val;
isStop = remove(root.val, root.right);
isLeftSubTree = false;
}
if (isStop)
return true;
int bf;// 删除前的root的平衡因子
if (isLeftSubTree) {
bf = height(root.left) - height(root.right) + 1;
if (bf == 0)
return true;
else if (bf == 1)
return false;
else if (bf == -1) {
int bfr = height(root.right.left) - height(root.right.left);
switch (bfr) {
case 0:
RR(root);
return true;
case -1:
RR(root);
return false;
default:
RL(root);
return false;
}
}
} else {
bf = height(root.left) - height(root.right) - 1;
if (bf == 0)
return true;
else if (bf == -1)
return false;
else if (bf == 1) {
int bfr = height(root.right.left) - height(root.right.left);
switch (bfr) {
case 0:
LL(root);
return true;
case 1:
LL(root);
return false;
default:
LR(root);
return false;
}
}
}
return false;
} private AVLNode<T> LL(AVLNode<T> node) {
AVLNode<T> nodeLeft = node.left;
node.left = nodeLeft.right;
nodeLeft.right = node;
node.height = Math.max(height(node.left), height(node.right)) + 1;
nodeLeft.height = Math.max(height(nodeLeft.left), node.height) + 1;
return nodeLeft;
} private AVLNode<T> RR(AVLNode<T> node) {
AVLNode<T> nodeRight = node.right;
node.right = nodeRight.left;
nodeRight.left = node;
node.height = Math.max(height(node.left), height(node.right)) + 1;
nodeRight.height = Math.max(height(nodeRight.right), node.height) + 1;
return nodeRight;
} private AVLNode<T> LR(AVLNode<T> node) {
node.left = RR(node.left);
return LL(node);
} private AVLNode<T> RL(AVLNode<T> node) {
node.right = LL(node.right);
return RR(node);
} }
数据结构——二叉查找树、AVL树的更多相关文章
- 006-数据结构-树形结构-二叉树、二叉查找树、平衡二叉查找树-AVL树
一.概述 树其实就是不包含回路的连通无向图.树其实是范畴更广的图的特例. 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合. 1.1.树的特性: 每个结点有零个或多个子 ...
- linux 内核数据结构之 avl树.
转载: http://blog.csdn.net/programmingring/article/details/37969745 https://zh.wikipedia.org/wiki/AVL% ...
- 数据结构之AVL树
AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 旋转 如果在AVL树中进行插入或删除节点后,可能导致AVL树失去平衡.这种失去平衡的可以概括为4种姿态:LL ...
- 二叉树-二叉查找树-AVL树-遍历
一.二叉树 定义:每个节点都不能有多于两个的儿子的树. 二叉树节点声明: struct treeNode { elementType element; treeNode * left; treeNod ...
- D&F学数据结构系列——AVL树(平衡二叉树)
AVL树(带有平衡条件的二叉查找树) 定义:一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树. 为什么要使用AVL树(即为什么要给二叉查找树增加平衡条件),已经在我之前的博文中说到过 ...
- [算法] 数据结构之AVL树
1 .基本概念 AVL树的复杂程度真是比二叉搜索树高了整整一个数量级——它的原理并不难弄懂,但要把它用代码实现出来还真的有点费脑筋.下面我们来看看: 1.1 AVL树是什么? AVL树本质上还是一棵 ...
- [javaSE] 数据结构(AVL树基本概念)
AVL树是高度平衡的二叉树,任何节点的两个子树的高度差别<=1 实现AVL树 定义一个AVL树,AVLTree,定义AVLTree的节点内部类AVLNode,节点包含以下特性: 1.key——关 ...
- 面试题:什么叫平衡二叉查找树--AVL树
查找.插入和删除在平均和最坏情况下都是O(log n) 增加和删除可能需要通过一次或多次树旋转来重新平衡这个树 节点的平衡因子是它的左子树的高度减去它的右子树的高度.带有平衡因子 1.0 或 -1 的 ...
- 大话数据结构—平衡二叉树(AVL树)
平衡二叉树(Self-Balancing Binary Search Tree/Height-Balanced Binary Search Tree),是一种二叉排序树,当中每个节点的左子树和右子树的 ...
- 二叉树学习笔记之经典平衡二叉树(AVL树)
二叉查找树(BSTree)中进行查找.插入和删除操作的时间复杂度都是O(h),其中h为树的高度.BST的高度直接影响到操作实现的性能,最坏情况下,二叉查找树会退化成一个单链表,比如插入的节点序列本身就 ...
随机推荐
- 关于IOC的思考
SOLID面向对象的五个设计原则对于开发人员非常重要,其身影在任何大中型软件项目中随处可见,建议必须掌握并灵活应用.此五原则分别为: 单一职责原则(Single Resposibility P ...
- jquery 获取和设置 checkbox radio 和 select option的值?
============== 获取和设置 checkbox radio 和 select的值? === val()函数, 其名字就表达了 它的意思: 他就是= value 的简写! val就是valu ...
- LINUX系统知识(转)
原文链接:http://blog.chinaunix.net/uid-725717-id-2060377.html 在Linux上配置好svnserve,通过eclipse访问,实现版本控制.但是开启 ...
- [整理]Android开发(二)-Weather App
private class WeatherData{ private String _weatherDescription; private Integer _currentTemperature; ...
- Java五道输出易错题解析(避免小错误)
收集了几个易错的或好玩的Java输出题,分享给大家,以后在编程学习中稍微注意下就OK了. 1. 看不见的空格? 下面的输出会正常吗? package basic; public class Integ ...
- 【翻译】Tomcat 6.0 部署与发布
本篇参考Tomcat官方文档:<First Webapp>翻译,并结合自己的开发经验介绍关于tomcat部署以及发布的相关内容. 1 目录结构 在tomcat中所有的应用都是放置在CATA ...
- PHP截取中文无乱码函数——cutstr
转载:http://blog.sina.com.cn/s/blog_694c144f010179wj.html 真正好用的PHP截取中文无乱码函数——cutstr (2012-07-09 11:17: ...
- Windows 8 IIS中配置PHP运行环境的方法
在Windows 8 的IIS(8.0)中搭建PHP运行环境: 一:安装IIS服务器 1.进入控制面板>>程序和功能>>打开或关闭Windows 功能,找到Internet信息 ...
- 用jQuery编的一个分页小代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 雪峰配置的nginx