麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

樹——平衡二叉樹插入和查找的JAVA實(shí)現(xiàn)(2):增加刪除方法

2019-11-14 23:33:02
字體:
供稿:網(wǎng)友
樹——平衡二叉樹插入和查找的java實(shí)現(xiàn)(2):增加刪除方法
package com.tomsnail.data.tree;/** * AVL二叉平衡樹 * @author tomsnail * @date 2015年3月30日 下午4:35:50 */public class AVLTree {        /**     * 根節(jié)點(diǎn)     * @author tomsnail     * @date 2015年3月30日 下午4:36:54     */    PRivate AVLNode rootNode;        private String bulidType = "";        /**     * 增加一個(gè)節(jié)點(diǎn)     * @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);                }                reBuild(tempRootNode);            }        }    }    /**     * 右旋     * @author tomsnail     * @date 2015年3月30日 下午9:23:28     */    private void Rrotate(AVLNode node,AVLNode tempRootNode){        AVLNode rotateNode = tempRootNode.getRightNode();//旋轉(zhuǎn)節(jié)點(diǎn)        AVLNode rootNode = tempRootNode.getRootNode();//主根節(jié)點(diǎn)        String type = "";        if(rootNode!=null){            if(rootNode.getLeftNode()==tempRootNode){                type="l";            }else{                type="r";            }        }        AVLNode adjustNode = rotateNode.getLeftNode();//調(diào)整節(jié)點(diǎn)        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();//旋轉(zhuǎn)節(jié)點(diǎn)        AVLNode rootNode = tempRootNode.getRootNode();//主根節(jié)點(diǎn)        String type = "";        if(rootNode!=null){//子樹類型            if(rootNode.getLeftNode()==tempRootNode){                type="l";            }else{                type="r";            }        }        AVLNode adjustNode = rotateNode.getRightNode();//調(diào)整節(jié)點(diǎn)        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);        }    }        /**     * 查找最小不平衡的根節(jié)點(diǎn)     * @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;    }        //獲取不平衡的根節(jié)點(diǎn)    private AVLNode getNoBalance(AVLNode node){        if(node.getRootNode()==null){            return null;        }else{            if(!isBalance(node.getRootNode())){                return node.getRootNode();            }else{                return getNoBalance(node.getRootNode());            }        }    }        /**     * 刪除一個(gè)節(jié)點(diǎn)     * @author tomsnail     * @date 2015年3月30日 下午4:36:20     */    public void delete(int value){        AVLNode wantDeleteNode = find(value);        if(wantDeleteNode==null){            return;        }else{            if(wantDeleteNode.getLeftNode()==null&&wantDeleteNode.getRightNode()==null){//刪除節(jié)點(diǎn)沒有左右子樹                AVLNode rootNode = wantDeleteNode.getRootNode();                if(rootNode!=null){                    if(rootNode.getLeftNode()==wantDeleteNode){                        rootNode.setLeftNode(null);                    }else{                        rootNode.setRightNode(null);                    }                    reBuild(rootNode);                }            }else if(wantDeleteNode.getRightNode()==null){//刪除節(jié)點(diǎn)只有左子樹                AVLNode rootNode = wantDeleteNode.getRootNode();                if(rootNode!=null){                    if(rootNode.getLeftNode()==wantDeleteNode){                        rootNode.setLeftNode(wantDeleteNode.getLeftNode());                    }else{                        rootNode.setRightNode(wantDeleteNode.getLeftNode());                    }                    wantDeleteNode.setLeftNode(null);                    reBuild(rootNode);                }            }else if(wantDeleteNode.getLeftNode()==null){//刪除節(jié)點(diǎn)只有右子樹                AVLNode rootNode = wantDeleteNode.getRootNode();                if(rootNode!=null){                    if(rootNode.getRightNode()==wantDeleteNode){                        rootNode.setLeftNode(wantDeleteNode.getRightNode());                    }else{                        rootNode.setRightNode(wantDeleteNode.getRightNode());                    }                    wantDeleteNode.setRightNode(null);                    reBuild(rootNode);                }            }else {//刪除節(jié)點(diǎn)有左右子樹                AVLNode maxNode = getLeftMaxValueNode(wantDeleteNode.getLeftNode());//找到節(jié)點(diǎn)左子樹最大值的節(jié)點(diǎn)                AVLNode rootMaxNode = maxNode.getRootNode();//獲得該節(jié)點(diǎn)的父節(jié)點(diǎn)                if(maxNode.getLeftNode()!=null){//如果最大值節(jié)點(diǎn)有左子樹,則將最大值節(jié)點(diǎn)的父節(jié)點(diǎn)的右子樹設(shè)為它                    rootMaxNode.setRightNode(maxNode.getLeftNode());                    maxNode.setLeftNode(null);                }else{//否則置空                    rootMaxNode.setRightNode(null);                }                wantDeleteNode.setValue(maxNode.getValue());//把要?jiǎng)h除節(jié)點(diǎn)的值用最大值節(jié)點(diǎn)的值替換                maxNode=null;//引用置空                reBuild(rootMaxNode);            }        }    }    //得到左子樹最大值節(jié)點(diǎn)    private AVLNode getLeftMaxValueNode(AVLNode node){        if(node!=null&&node.getRightNode()!=null){            return getLeftMaxValueNode(node.getRightNode());        }else{            return node;        }    }        /**     * 查找一個(gè)節(jié)點(diǎn)     * @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;        }    }        /**     * 中序遍歷     * @author tomsnail     * @date 2015年3月31日 下午6:23:05     */    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());        tree.delete(4);        System.out.println(isBalance(tree.getRootNode()));        System.out.println();        //tree.find(40);    }            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;    }}


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 免费久久精品 | 日韩精品a在线观看 | 国产精品麻豆91 | 99精品国产一区二区三区 | 国产一级一国产一级毛片 | 在线观看91精品 | 国产精品一区二区日韩 | 日韩黄色av网站 | 香蕉视频18 | 在线播放黄色片 | 欧美一级毛片欧美一级成人毛片 | 久久精品国产99久久6动漫亮点 | 欧美一级做性受免费大片免费 | 中文字幕www. | 色污视频在线观看 | 欧美一级美国一级 | 国产99久久久久久免费看农村 | 欧美一级二级毛片视频 | 精品一区二区三区在线观看国产 | 羞羞视频一区二区 | 国产成人午夜高潮毛片 | 国产一区二区三区四区五区在线 | 色视频在线播放 | 麻豆视频在线播放 | 在火车上摸两乳爽的大叫 | 久久国语对白 | 免费a级毛片大学生免费观看 | 91精品国产综合久久久动漫日韩 | 亚洲va久久久噜噜噜久牛牛影视 | 羞羞答答视频 | 国产精品久久久久久238 | 免费看综艺策驰影院 | 中文字幕一二三区芒果 | 久久久久免费精品 | 黄网站在线观 | 97中文| 国产精品久久久久国产精品三级 | 国产免费一级大片 | 羞羞网站视频 | 久久国产精品久久久久 | 色成人在线 |