树——平衡二叉树插入和查找的JAVA实现

package com.tomsnail.data.tree;
/**
 * AVL二叉平衡树
 * @author tomsnail
 * @date 2015年3月30日 下午4:35:50
 */
public class AVLTree {

    /**
     * 根节点
     * @author tomsnail
     * @date 2015年3月30日 下午4:36:54
     */
    private AVLNode rootNode;

    private String bulidType = "";

    /**
     * 增加一个节点
     * @author tomsnail
     * @date 2015年3月30日 下午4:36:08
     */
    public void add(int value){
        AVLNode subNode = null;
        if(rootNode==null){
            subNode  = new AVLNode(value);
            rootNode = subNode;
        }else{
            subNode = addNode(rootNode,value);
        }
        reBuild(subNode);

    }

    private AVLNode addNode(AVLNode node,int value){
        AVLNode subNode = null;
        if(node.getValue()>value){
            if(node.getLeftNode()==null){
                subNode = new AVLNode(value);
                node.setLeftNode(subNode);
            }else{
                subNode = addNode(node.getLeftNode(), value);
            }
        }
        if(node.getValue()<value){
            if(node.getRightNode()==null){
                subNode = new AVLNode(value);
                node.setRightNode(subNode);
            }else{
                subNode = addNode(node.getRightNode(),value);
            }
        }
        return subNode;
    }
    /**
     * 重平衡树
     * @author tomsnail
     * @date 2015年3月30日 下午5:42:00
     */
    private void reBuild(AVLNode node){
        if(node!=null){
            AVLNode tempRootNode = findTempRootNode(node);
            if(tempRootNode!=null){
                if(bulidType.equals("ll")){
                    Lrotate(node,tempRootNode);
                }else if(bulidType.equals("rr")){
                    Rrotate(node,tempRootNode);
                }else if(bulidType.equals("lr")){
                    Rrotate(node,tempRootNode.getLeftNode());
                    Lrotate(node,tempRootNode);
                }else if(bulidType.equals("rl")){
                    Lrotate(node,tempRootNode.getRightNode());
                    Rrotate(node,tempRootNode);
                }
            }
        }
    }
    /**
     * 左旋
     * @author tomsnail
     * @date 2015年3月30日 下午9:23:28
     */
    private void Rrotate(AVLNode node,AVLNode tempRootNode){
        AVLNode rotateNode = tempRootNode.getRightNode();
        AVLNode rootNode = tempRootNode.getRootNode();
        String type = "";
        if(rootNode!=null){
            if(rootNode.getLeftNode()==tempRootNode){
                type="l";
            }else{
                type="r";
            }
        }
        AVLNode adjustNode = rotateNode.getLeftNode();
        rotateNode.setLeftNode(tempRootNode);
        tempRootNode.setRightNode(null);
        if(adjustNode!=null){
            tempRootNode.setRightNode(adjustNode);
        }
        if(rootNode==null){
            rotateNode.setRootNode(null);
            this.rootNode = rotateNode;
        }
        if(type.equals("r")){
            rootNode.setRightNode(rotateNode);
        }else if(type.equals("l")){
            rootNode.setLeftNode(rotateNode);
        }
    }
    /**
     * 右旋
     * @author tomsnail
     * @date 2015年3月30日 下午9:23:28
     */
    private void Lrotate(AVLNode node,AVLNode tempRootNode){
        AVLNode rotateNode = tempRootNode.getLeftNode();
        AVLNode rootNode = tempRootNode.getRootNode();
        String type = "";
        if(rootNode!=null){
            if(rootNode.getLeftNode()==tempRootNode){
                type="l";
            }else{
                type="r";
            }
        }
        AVLNode adjustNode = rotateNode.getRightNode();
        rotateNode.setRightNode(tempRootNode);
        tempRootNode.setLeftNode(null);
        if(adjustNode!=null){
            tempRootNode.setLeftNode(adjustNode);
        }
        if(rootNode==null){
            rotateNode.setRootNode(null);
            this.rootNode = rotateNode;
        }
        if(type.equals("r")){
            rootNode.setRightNode(rotateNode);
        }else if(type.equals("l")){
            rootNode.setLeftNode(rotateNode);
        }
    }

    /**
     * 查找最小不平衡的根节点
     * @author tomsnail
     * @date 2015年3月30日 下午5:40:55
     */
    private AVLNode findTempRootNode(AVLNode node){
        AVLNode noB = getNoBalance(node);
        if(noB==null){
            return null;
        }
        if(isTypeLL(noB)){
            bulidType = "ll";
        }else if(isTypeRR(noB)){
            bulidType = "rr";
        }else if(isTypeLR(noB)){
            bulidType = "lr";
        }else if(isTypeRL(noB)){
            bulidType = "rl";
        }
        return noB;
    }

    private boolean isTypeLL(AVLNode noB){
        try {
            if(noB.getRightNode()==null&&noB.getLeftNode().getRightNode()==null&&!noB.getLeftNode().getLeftNode().hasSubNode()){
                return true;
            }
            if(noB.getRightNode()!=null&&noB.getLeftNode().getRightNode()!=null&&noB.getLeftNode().getLeftNode().hasSubNode()){
                return true;
            }
        } catch (Exception e) {
        }
        return false;
    }
    private boolean isTypeRR(AVLNode noB){
        try {
            if(noB.getLeftNode()==null&&noB.getRightNode().getLeftNode()==null&&!noB.getRightNode().getRightNode().hasSubNode()){
                return true;
            }
            if(noB.getLeftNode()!=null&&noB.getRightNode().getLeftNode()!=null&&noB.getRightNode().getRightNode().hasSubNode()){
                return true;
            }
        } catch (Exception e) {
        }
        return false;
    }
    private boolean isTypeLR(AVLNode noB){
        try {
            if(noB.getRightNode()==null&&noB.getLeftNode().getLeftNode()==null&&!noB.getLeftNode().getRightNode().hasSubNode()){
                return true;
            }
            if(noB.getRightNode()!=null&&noB.getLeftNode().getLeftNode()!=null&&noB.getLeftNode().getRightNode().hasSubNode()){
                return true;
            }
        } catch (Exception e) {
        }
        return false;
    }
    private boolean isTypeRL(AVLNode noB){
        try {
            if(noB.getLeftNode()==null&&noB.getRightNode().getRightNode()==null&&!noB.getRightNode().getLeftNode().hasSubNode()){
                return true;
            }
            if(noB.getLeftNode()!=null&&noB.getRightNode().getRightNode()!=null&&noB.getRightNode().getLeftNode().hasSubNode()){
                return true;
            }
        } catch (Exception e) {
        }
        return false;
    }

    private AVLNode getNoBalance(AVLNode node){
        if(node.getRootNode()==null){
            return null;
        }else{
            if(!isBalance(node.getRootNode())){
                return node.getRootNode();
            }else{
                return getNoBalance(node.getRootNode());
            }
        }
    }/**
     * 查找一个节点
     * @author tomsnail
     * @date 2015年3月30日 下午4:36:35
     */
    public AVLNode find(int value){
        return findWith2(rootNode,value);
    }
    private AVLNode findWith2(AVLNode node,int value){
        if(node==null){
            return null;
        }
        System.out.println(node.getValue());
        if(node.getValue()>value){
            return findWith2(node.getLeftNode(),value);
        }else if(node.getValue()<value){
            return findWith2(node.getRightNode(),value);
        }else{
            return node;
        }
    }

    public void midScan(AVLNode node){
        if(node==null){
            return;
        }
        midScan(node.getLeftNode());
        System.out.println(node.getValue());
        midScan(node.getRightNode());
    }

    public AVLNode getRootNode() {
        return rootNode;
    }

    public static void main(String[] args) {
        int[] is = new int[]{10,11,23,3,5,44,32,4,6,18,19,7,8,70,50,60,40,55,65,53,80};//10,11,23,3,5,44,32,4,6,18,19,7,8,70,50,60,40,55,65,53,80
        AVLTree tree = new AVLTree();
        for(int i=0;i<is.length;i++){
            tree.add(is[i]);
        }
        System.out.println(tree.getRootNode().getValue());
        System.out.println("----------------------------");
        tree.midScan(tree.getRootNode());
        System.out.println(isBalance(tree.getRootNode()));
    }

    public static int depth(AVLNode node){
        if(node==null){
            return 0;
        }else{
            int ld = depth(node.getLeftNode());
            int rd = depth(node.getRightNode());
            return 1 + (ld >rd ? ld : rd);
        }
    }

    public static boolean isBalance(AVLNode node){
        if (node==null)
            return true;
        int dis = depth(node.getLeftNode()) - depth(node.getRightNode());
        if (dis>1 || dis<-1 )
            return false;
        else
            return isBalance(node.getLeftNode()) && isBalance(node.getRightNode());
    }
}class AVLNode{
    private int value;
    private AVLNode leftNode;
    private AVLNode rightNode;
    private AVLNode rootNode;
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public AVLNode getLeftNode() {
        return leftNode;
    }
    public void setLeftNode(AVLNode leftNode) {
        this.leftNode = leftNode;
        if(leftNode!=null){
            leftNode.setRootNode(this);
        }
    }
    public AVLNode getRightNode() {
        return rightNode;
    }
    public void setRightNode(AVLNode rightNode) {
        this.rightNode = rightNode;
        if(rightNode!=null){
            rightNode.setRootNode(this);
        }
    }

    public AVLNode getRootNode() {
        return rootNode;
    }
    public void setRootNode(AVLNode rootNode) {
        this.rootNode = rootNode;
    }

    public boolean hasSubNode(){
        if(this.leftNode!=null||this.rightNode!=null){
            return true;
        }else{
            return false;
        }
    }

    public AVLNode(){
    }
    public AVLNode(int value){
        this.value = value;
    }
}
时间: 2024-10-08 17:02:23

树——平衡二叉树插入和查找的JAVA实现的相关文章

树——平衡二叉树插入和查找的JAVA实现(2):增加删除方法

package com.tomsnail.data.tree; /** * AVL二叉平衡树 * @author tomsnail * @date 2015年3月30日 下午4:35:50 */ public class AVLTree { /** * 根节点 * @author tomsnail * @date 2015年3月30日 下午4:36:54 */ private AVLNode rootNode; private String bulidType = ""; /** *

Java实现二叉排序树的插入、查找、删除

import java.util.Random; /** * 二叉排序树(又称二叉查找树) * (1)可以是一颗空树 * (2)若左子树不空,则左子树上所有的结点的值均小于她的根节点的值 * (3)若右子树不空,则右子树上所有的结点的值均大于她的根节点的值 * (4)左.右子树也分别为二叉排序树 * * * 性能分析: * 查找性能: * 含有n个结点的二叉排序树的平均查找长度和树的形态有关, * (最坏情况)当先后插入的关键字有序时,构成的二叉排序树蜕变为单枝树.查找性能为O(n) * (最好

萌新笔记——C++里创建 Trie字典树(中文词典)(二)(插入、查找、导入、导出)

萌新做词典第二篇,做得不好,还请指正,谢谢大佬! 做好了插入与遍历功能之后,我发现最基本的查找功能没有实现,同时还希望能够把内存的数据存入文件保存下来,并可以从文件中导入词典.此外,数据的路径是存在配置文件中的.甚至,还想尝试类似自动补全的功能.当然了,是做一个比较low的补全,比如传入"编程",能够得到"软件"."学习"."学习网站"."入门"四个字符串.但是传入"编"不会得到&quo

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺

【转】B树、B-树、B+树、B*树、红黑树、 二叉排序树、trie树Double Array 字典查找树简介

B  树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中:否则,如果查询关键字比结点关键字小,就进入左儿子:如果比结点关键字大,就进入右儿子:如果左儿子或右儿子的指针为空,则报告找不到相应的关键字: 如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树的搜索性

AVL树的插入和删除

一.AVL 树 在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为 1,因此它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度都是 O(log(n)).插入和删除元素的操作则可能需要借由一次或多次树旋转,以实现树的重新平衡. 节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反).带有平衡因子 1.0 或 -1 的节点被认为是平衡的.带有平衡因子 -2 或 2 的节点被认为是不平衡的,并需要重新平衡这个树.平衡因

顺序表 初始化 插入 删除 查找 合并 交换 判断为空 求长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define TRUE 1 #define ERROR -1 #define FALSE -1 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(SqList) #define MLC (Li

单链表 初始化 创建 头插法 尾插法 插入 删除 查找 合并 长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(LNode) #

Mybatis+Struts2的结合:实现用户插入和查找

总结一下今天一个成功的小实验:Mybatis+Struts2的结合:实现用户插入和查找.删除和修改如果以后写了,会继续更新. 一 准备工作. 1.新建一个java web项目. 2.在webContent\lib目录下导入所需要的jar包. a.struts2需要的jar包. struts2 xwork-core.jar strut2-core.jar ognl.jar commoms-lang.jar freemarker.jar commons-fileupload.jar 包的位置: st