平衡二叉树(AVL)java实现
数的节点
package com.ydp.tree.AVLTree;
public class Node{
private int data = 0;
private Node lchild = null;
private Node rchild = null;
private Node parent = null; public Node(){};
public Node(int data){
this.data = data;
}
public Node(int data,Node parent){
this.data = data;
this.parent = parent;
} public boolean hasLChild(){
return lchild != null;
} public boolean hasRChild(){
return rchild != null;
}
//当前节点树的深度
public int getTreeDepth(){
return getTreeDepth(this);
}
//指定节点树的深度
protected int getTreeDepth(Node node){
int depth = 0;
if(node != null){
int ldepth = getTreeDepth(node.getLchild());
int rdepth = getTreeDepth(node.getRchild());
depth =1 + (ldepth>rdepth?ldepth:rdepth);
}
return depth;
} public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getLchild() {
return lchild;
}
public void setLchild(Node lchild) {
this.lchild = lchild;
}
public Node getRchild() {
return rchild;
}
public void setRchild(Node rchild) {
this.rchild = rchild;
}
public Node getParent() {
return parent;
}
public void setParent(Node parent) {
this.parent = parent;
} public boolean isLChild(){ return this.parent.hasLChild()?this.parent.getLchild().getData()==this.data:false;
} public boolean equals(Node node){
return this.data == node.getData();
} }
平衡二叉树的实现
package com.ydp.tree.AVLTree;
import java.util.Stack;
public class AVLTree {
Node root = null;
public static void main(String[] args) {
AVLTree tree = new AVLTree();
tree.insert(50);
tree.insert(40);
tree.insert(30);
tree.print();
tree = new AVLTree();
tree.insert(50);
tree.insert(40);
tree.insert(60);
tree.insert(30);
tree.insert(45);
tree.insert(20);
tree.print();
tree = new AVLTree();
tree.insert(50);
tree.insert(60);
tree.insert(70);
tree.print();
tree = new AVLTree();
tree.insert(50);
tree.insert(40);
tree.insert(60);
tree.insert(55);
tree.insert(70);
tree.insert(80);
tree.print();
tree = new AVLTree();
tree.insert(50);
tree.insert(40);
tree.insert(45);
tree.print();
tree = new AVLTree();
tree.insert(50);
tree.insert(40);
tree.insert(60);
tree.insert(30);
tree.insert(45);
tree.insert(47);
tree.print();
tree = new AVLTree();
tree.insert(50);
tree.insert(60);
tree.insert(55);
tree.print();
tree = new AVLTree();
tree.insert(50);
tree.insert(40);
tree.insert(55);
tree.insert(53);
tree.insert(60);
tree.insert(70);
tree.print();
}
public void print(){
System.out.println("树的深度:"+this.getRoot().getTreeDepth());
this.preOrder();
System.out.println();
this.midOrder();
System.out.println("\n");
}
//插入节点数据
public void insert(int data){
if(this.root == null){
this.root = new Node(data);
}else{
insert(data,this.root);
}
}
//递归插入,将数据插入到合适的位置
protected void insert(int data,Node node){
if(data>node.getData()){
if(node.hasRChild()){
insert(data,node.getRchild());
}else{
node.setRchild(new Node(data,node));
}
if(getTreeDepth(node.getRchild())-getTreeDepth(node.getLchild())==2){
if(data>node.getRchild().getData()){
leftRotate(node);
}else{
rightLeftRotate(node);
}
}
}else if(data<node.getData()){
if(node.hasLChild()){
insert(data,node.getLchild());
}else{
node.setLchild(new Node(data,node));
}
if(getTreeDepth(node.getLchild())-getTreeDepth(node.getRchild())==2){
if(data<node.getLchild().getData()){
rightRotate(node);
}else{
leftRightRotate(node);
}
}
}
}
public Node getRoot() {
return root;
}
public void setRoot(Node root) {
this.root = root;
}
//顺时针旋转
public void rightRotate(Node node){
System.out.println("顺时针:"+node.getData());
Node tmp = node.getLchild();
if(node.getParent() == null){
this.root=node.getLchild();
}else{
if(node.isLChild()){
node.getParent().setLchild(tmp);
}else{
node.getParent().setRchild(tmp);
}
}
tmp.setParent(node.getParent());
node.setLchild(tmp.getRchild());
node.setParent(tmp);
tmp.setRchild(node);
}
//先顺后逆时针
public void rightLeftRotate(Node node){
System.out.println("先顺后逆时针:"+node.getData());
rightRotate(node.getRchild());
leftRotate(node);
}
//逆时针
public void leftRotate(Node node){
System.out.println("逆时针:"+node.getData());
Node tmp = node.getRchild();
if(node.getParent() == null){
this.root=node.getRchild();
}else{
if(node.isLChild()){
node.getParent().setLchild(tmp);
}else{
node.getParent().setRchild(tmp);
}
}
tmp.setParent(node.getParent());
node.setRchild(tmp.getLchild());
node.setParent(tmp);
tmp.setLchild(node);
}
//逆时针
public void leftRightRotate(Node node){
System.out.println("先逆后顺时针:"+node.getData());
leftRotate(node.getLchild());
rightRotate(node);
}
//先序遍历
public void preOrder(){
Stack<Node> stack = new Stack<Node>();
Node node = root;
while(node != null || !stack.empty()){
while(node != null){
System.out.print(node.getData()+" ");
stack.push(node);
node = node.getLchild();
}
node = stack.pop();
node = node.getRchild();
}
}
//中序遍历
public void midOrder(){
Stack<Node> stack = new Stack<Node>();
Node node = root;
while(node != null || !stack.empty()){
while(node != null){
stack.push(node);
node = node.getLchild();
}
node = stack.pop();
System.out.print(node.getData()+" ");
node = node.getRchild();
}
}
protected int getTreeDepth(Node node){
int depth = 0;
if(node != null){
int ldepth = getTreeDepth(node.getLchild());
int rdepth = getTreeDepth(node.getRchild());
depth =1 + (ldepth>rdepth?ldepth:rdepth);
}
return depth;
}
}
平衡二叉树(AVL)java实现的更多相关文章
- 平衡二叉树(AVL)的理解和实现(Java)
AVL的定义 平衡二叉树:是一种特殊的二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1.从平衡二叉树的名字中可以看出来,它是一种高度平衡的二叉排序树.那么什么叫做高度平衡呢?意思就是要么它 ...
- Java 树结构实际应用 四(平衡二叉树/AVL树)
平衡二叉树(AVL 树) 1 看一个案例(说明二叉排序树可能的问题) 给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在. 左边 BST 存在的问题分析: ...
- 数据结构与算法--从平衡二叉树(AVL)到红黑树
数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树.算法的性能取决于树的形状,而树的形状取决于插入键的顺序.在最好的情况下,n个结点的树是完全平衡的,如下图"最好情况&q ...
- 二叉查找树(BST)、平衡二叉树(AVL树)(只有插入说明)
二叉查找树(BST).平衡二叉树(AVL树)(只有插入说明) 二叉查找树(BST) 特殊的二叉树,又称为排序二叉树.二叉搜索树.二叉排序树. 二叉查找树实际上是数据域有序的二叉树,即对树上的每个结点, ...
- 平衡二叉树AVL - 插入节点后旋转方法分析
平衡二叉树 AVL( 发明者为Adel'son-Vel'skii 和 Landis)是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1. 首先我们知道,当插入一个节点,从此插入点到树根 ...
- 二叉查找树、平衡二叉树(AVL)、B+树、联合索引
1. [定义] 二叉排序树(二拆查找树)中,左子树都比节点小,右子树都比节点大,递归定义. [性能] 二叉排序树的性能取决于二叉树的层数 最好的情况是 O(logn),存在于完全二叉排序树情况下,其访 ...
- java平衡二叉树AVL数
平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树 右旋:在插入二叉树的时候,根节点的右侧高 ...
- 【数据结构】平衡二叉树—AVL树
(百度百科)在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增 ...
- 平衡二叉树AVL删除
平衡二叉树的插入过程:http://www.cnblogs.com/hujunzheng/p/4665451.html 对于二叉平衡树的删除采用的是二叉排序树删除的思路: 假设被删结点是*p,其双亲是 ...
- 平衡二叉树AVL插入
平衡二叉树(Balancedbinary tree)是由阿德尔森-维尔斯和兰迪斯(Adelson-Velskiiand Landis)于1962年首先提出的,所以又称为AVL树. 定义:平衡二叉树或为 ...
随机推荐
- Sql2008中使用DataTable作为存储过程的参数
使用DataTable作为存储过程的参数 最近工作中写了几个存储过 程,需要向存储过程中传递字符串,因为SQL Server 2000中没有内置类似于 split 的函数,只好自己处理,将前台数据 ...
- ASP 调用dll(VB)及封装dll实例
ASP调用dll及封装dll实例,封装为dll可以提供运行效率,加密代码. 打开VB6,新建ActiveX DLL 2.在工程引用中加入Microsoft Active Server Pages Ob ...
- 转载[POJ题型分类]
北大ACM题分类 主流算法: 1.搜索 //回溯 2.DP(动态规划) 3.贪心 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同等安置矩形的 ...
- power desinger 学习笔记<一>
如果一张表有 很多字段(多于30个),那么一个一个复制粘贴,耗时耗力.可以偷懒,事先编辑好 sql脚本,然后把sql脚本导入 power designer,是不是很方便? 看下面的 1. 打开Pow ...
- Linux fork操作之后发生了什么?又会共享什么呢?
今天我在阅读<Unix网络编程>时候遇到一个问题:accept返回时的connfd,是父子进程之间共享的?我当时很不理解,难道打开的文件描述符不是应该在父子进程间相互独立的吗?为什么是共享 ...
- nim
上帝创造了一个n*m棋盘,每一个格子都只有可能是黑色或者白色的. 亚当和夏娃在玩一个游戏,每次寻找边长为x的正方形,其中每个格子必须为黑色,然后将这些格子染白. 如果谁不能操作了,那么那个人就输了. ...
- javascript——集合类
/** * Created by Administrator on 2015/4/14. */ function Set() { this.values = {}; this.n = 0; this. ...
- 使用BeanUtils组件
使用BeanUtils组件 前提 1:导入commons-beanutils-1.8.3.jar //根据 本人使用的是1.8.3的版本 2:导入日志包 //就是loggin ...
- JQuery 实现鼠标经过图片高亮显示,其余图片变暗
效果图: 当鼠标经过图片时,其余图片变暗,来高亮显示当前图片,主要用的是对比度.当然你也可以先把其他图片默认变暗,鼠标经过时高亮显示,不过,无鼠标经过时整体图片都会是偏暗色调. 效果可以通过 三步实现 ...
- 定义文字用em、rem,效果和px一样
1em=16px font-size: 2.4rem;/*2.4 × 10px = 24px*/