package com.test.tree;

/**
* 带有平衡条件的二叉查找树
* */
public class AVLBinarySearchTree<T extends Comparable<? super T>> { /*内部类,定义二叉树中的节点结构*/
private static class TreeNode<T>{
private T data; //节点的值
private TreeNode<T> lt; //节点左子树
private TreeNode<T> rt; //节点右子树
private int height; //用来记录节点的高度,进行单旋转或双旋转 public TreeNode(T data) {
this(data, null, null);
}
public TreeNode(T data, TreeNode<T> lt, TreeNode<T> rt) {
this.data = data;
this.lt = lt;
this.rt = rt;
this.height = 0;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public TreeNode<T> getLt() {
return lt;
}
public void setLt(TreeNode<T> lt) {
this.lt = lt;
}
public TreeNode<T> getRt() {
return rt;
}
public void setRt(TreeNode<T> rt) {
this.rt = rt;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
} /**
* 计算节点的高度
* @param t 输入子树
* @return 返回树的高度
*/
public int height(TreeNode<T> t){
return t==null ? -1 : t.height;
} /**
* 给树中添加节点
* @param data 要插入的节点值
* @param t 要插入的子树
* @return 插入后形成的新的树
*/
public TreeNode<T> insert(T data, TreeNode<T> t){
if(t == null){
//树为空
return new TreeNode<T>(data, null ,null);
}
int compareReslt = compare(data, t.data);
if(compareReslt < 0){
//插入的数小于节点数,放入左子树中
t.lt = insert(data, t.lt) ; //递归插入左子树 //插入后检查当前节点的左右子树是否平衡
if(height(t.lt)-height(t.rt) == 2){
if(compare(data, t.lt.data) < 0){
t = rotateWithLeftChild(t); //单旋转
}else if(compare(data, t.lt.data) > 0){
t = doubleWithLeftChild(t); //双旋转
}
}
}else if(compareReslt > 0){
//插入的数大于节点数,放入右子树中
t.rt = insert(data, t.rt) ; //递归插入左子树 //插入后检查当前节点的左右子树是否平衡
if(height(t.rt)-height(t.lt) == 2){
if(compare(data, t.rt.data) > 0){
t = rotateWithRightChild(t); //单旋转
}else if(compare(data, t.rt.data) > 0){
t = doubleWithRightChild(t); //双旋转
}
}
}
t.height = Math.max(height(t.lt), height(t.rt)) + 1;
return t;
}
private TreeNode<T> rotateWithRightChild(TreeNode<T> k2) {
// TODO Auto-generated method stub
TreeNode<T> k1 = k2.rt;
k2.rt = k1.lt; //左子树的右节点介于左子树根节点和根节点之间,赋值给根节点的左子树
k1.lt = k2; //将根节点赋值给左节点的右节点
k2.height = Math.max(height(k2.lt), height(k2.rt)) + 1;
k1.height = Math.max(height(k1.rt), k2.height) + 1;
return k1;
} private TreeNode<T> doubleWithRightChild(TreeNode<T> k3) {
// TODO Auto-generated method stub
k3.rt = rotateWithLeftChild(k3.rt);
return rotateWithRightChild(k3);
} /**
* 单旋转
* @param t
* @return
*/
private TreeNode<T> rotateWithLeftChild(TreeNode<T> k2) {
// TODO Auto-generated method stub
TreeNode<T> k1 = k2.lt; //左子树的根节点赋给K1
k2.lt = k1.rt; //左子树的右节点介于左子树根节点和根节点之间,赋值给根节点的左子树
k1.rt = k2; //将根节点赋值给左节点的右节点
k2.height = Math.max(height(k2.lt), height(k2.rt)) + 1;
k1.height = Math.max(height(k1.lt), k2.height) + 1;
return k1;
}
/**
* 双旋转
* @param t
* @return
*/
private TreeNode<T> doubleWithLeftChild(TreeNode<T> k3) {
// TODO Auto-generated method stub
k3.lt = rotateWithRightChild(k3.lt);
return rotateWithLeftChild(k3);
} /**
* 比较两个值是否相等
* @param data1
* @param data2
* @return
*/
public int compare(T data1, T data2){
return data1.compareTo(data2);
} /*中序遍历*/
public void printTree(TreeNode<T> t){
if(t != null){
printTree(t.lt);
System.out.print(t.data+"、");
printTree(t.rt);
}
} public static void main(String[] args) {
AVLBinarySearchTree<Integer> aVLBinarySearchTree = new AVLBinarySearchTree<Integer>();
TreeNode<Integer> node = new TreeNode<Integer>(8);
node = aVLBinarySearchTree.insert(6, node);
node = aVLBinarySearchTree.insert(16, node);
node = aVLBinarySearchTree.insert(13, node);
node = aVLBinarySearchTree.insert(19, node);
node = aVLBinarySearchTree.insert(7, node);
node = aVLBinarySearchTree.insert(21, node);
node = aVLBinarySearchTree.insert(23, node);
aVLBinarySearchTree.printTree(node.lt);
aVLBinarySearchTree.printTree(node.rt);
}
}

平衡二叉树--java的更多相关文章

  1. 平衡二叉树 JAVA实现 亲测可用

    平衡二叉树的JAVA实现 亲测可用 包括LL LR RL RR四种情况的旋转算法 以及添加删除树结点之后对平衡二叉树的维护算法 都已经实现并测试过 没有问题. 代码地址可以直接上我的GIT clone ...

  2. 数据结构-平衡二叉树Java实现

    1,Node.java package com.cnblogs.mufasa.BalanceBinaryTree; public class Node { Node parent; Node left ...

  3. leetcode-110:判断平衡二叉树 Java

    Balanced Binary Tree Given a binary tree, determine if it is height-balanced. For this problem, a he ...

  4. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  5. Java实现平衡二叉树(AVLTree)的构建

    近期在学习数据结构上关于平衡二叉树的知识,看了严老师的思路,感觉用java写出递归的构建方式有点困难,由于当中的递归须要把引用传进去,所以感觉是要实现起来比較麻烦,所以就首先想到使用非递归的方式来实现 ...

  6. 平衡二叉树(AVL)java实现

    数的节点 package com.ydp.tree.AVLTree; public class Node{ private int data = 0; private Node lchild = nu ...

  7. 平衡二叉树的java实现

    转载请注明出处! 一.概念 平衡二叉树是一种特殊的二叉搜索树,关于二叉搜索树,请查看上一篇博客二叉搜索树的java实现,那它有什么特别的地方呢,了解二叉搜索树的基本都清楚,在按顺序向插入二叉搜索树中插 ...

  8. 【Java】 剑指offer(55-2) 平衡二叉树

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树 ...

  9. 【Java】 大话数据结构(12) 查找算法(3) (平衡二叉树(AVL树))

    本文根据<大话数据结构>一书及网络资料,实现了Java版的平衡二叉树(AVL树). 平衡二叉树介绍 在上篇博客中所实现的二叉排序树(二叉搜索树),其查找性能取决于二叉排序树的形状,当二叉排 ...

随机推荐

  1. mock数据(模拟后台数据)

    mock数据(模拟后台数据) - Emily恩 - 博客园 https://www.cnblogs.com/enboke/p/vue.html Mock.js http://mockjs.com/ 前 ...

  2. 费马小定理 Fermat Theory

    w 整数的质数次方和自身的差是是质数的倍数 费马小定理(Fermat Theory)是数论中的一个重要定理,其内容为: 假如p是质数,且Gcd(a,p)=1,那么 a(p-1)≡1(mod p).即: ...

  3. 【转】@javax.ws.rs Webservice注解

    用于webservice. 1.路径 @javax.ws.rs.Path 标识要请求的资源类或资源方法的uri路径. 例,@Path("animal"),表示下一层路径是anima ...

  4. python并发编程之多进程1--(互斥锁与进程间的通信)

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

  5. (转)IIS tomcat共用80端口解决一个IP多个域名:使用Nginx反向代理方式使两者兼容

    from :http://www.cnblogs.com/wuyou/p/3455619.html 环境: windows server 2003,IIS6服务器,Tomcat7服务器 域名有几个: ...

  6. iOS 4.5.5版本 被拒绝!!!! "App Rejected : non-public APIs"

    今天上午收到邮件说是被拒绝了 原文是 这一版本 我就添加一个购买sku的方法, 并没有添加什么库 ,简简单单的一次升级给我出一私有方法拒绝!!!!! 在xcode8  iOS10 刚出来 ,苹果新规则 ...

  7. $《第一行代码:Android》读书笔记——第10章 Android网络编程

    (一)WebView的用法 1.WebView也是一个普通的控件. 2.常用用法: WebView webView = (WebView)findViewById(R.id.web_view); we ...

  8. flex 实现图片播放 方案一 图片全部预加载放内存

    这种方案,对于web的应用有局限性,在图片量比较多,比较大的时候,就会爆浏览器异常.一般建议轻量级的采用这种方案. <?xml version="1.0" encoding= ...

  9. R中的参数传递函数:commandArgs(),getopt().

    1.commandArgs(),是R自带的参数传递函数,属于位置参数. ##test.R args=commandArgs(T) print (args[1])##第一个外部参数 print (arg ...

  10. Object.defineProperty小解

    最早认识这个函数,源于对vue双向绑定的探索,vue通过这个函数实现属性挟持并结合发布者-订阅者模式实现双向绑定 先看一个实例: var o= {name: 'a'} Object.definePro ...