首页 > 学院 > 开发设计 > 正文

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

2019-11-14 23:32:33
字体:
来源:转载
供稿:网友
树——平衡二叉树插入和查找的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;    }}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表