• 树——二叉搜索树的实现


    1.定义
       它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值
       均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
    2.插入规则
        向一个二叉排序树b中插入一个结点s的算法,过程为:若b是空树,则将s所指结点作为根结点插入,否则:若s->data等于b的根结点的数据域之值,则返回,否则:
        若s->data小于b的根结点的数据域之值,则把s所指结点插入到左子树中,否则:把s所指结点插入到右子树中。
    3.删除规则
        若D结点为叶子结点,即L(左子树)和R(右子树)均为空树。由于删去叶子结点不破坏整棵树的结构,则只需修改其双亲结点的指针即可。
      
        若D结点只有左子树L或右子树R,此时只要令L或R直接成为其双亲结点P的左子树或右子树即可,作此修改也不破坏二叉排序树的特性。
      
        若D结点的左子树和右子树均不空。在删去D之后,为保持其它元素之间的相对位置不变,可按中序遍历保持有序进行调整,可以有两种做法:其一是令D的左子树为P的
        左子树,S为P左子树的最右下的结点,而D的右子树为S的右子树;其二是令D的直接前驱(或直接后继)替代D,然后再从二叉排序树中删去它的直接前驱(或
        直接后继)。
      
    4.查找
        若b是空树,则搜索失败,否则:若x等于b的根结点的数据域之值,则查找成功;否则:若x小于b的根结点的数据域之值,则搜索左子树;否则:查找右子树。
    5.Java实现
      1).Node类
       
    public class Node{
        private int value;
        private Node leftNode;
        private Node rightNode;
        public int getValue() {
            return value;
        }
        public void setValue(int value) {
            this.value = value;
        }
        public Node getLeftNode() {
            return leftNode;
        }
        public void setLeftNode(Node leftNode) {
            this.leftNode = leftNode;
        }
        public Node getRightNode() {
            return rightNode;
        }
        public void setRightNode(Node rightNode) {
            this.rightNode = rightNode;
        }
        public Node(){
        }
        public Node(int value){
            this.value = value;
        }
    }
      2).Tree类
    public class Serach2Tree {
    
        private Node rootNode;
        
        //加入节点
        public void addNode(int value){
            if(rootNode==null){
                rootNode = new Node(value);
            }else{
                addNode(rootNode,value);
            }
        }
        //递归遍历加入
        private void addNode(Node node,int value){
            if(node==null){
                node = new Node(value);
            }else{
                if(node.getValue()>value){
                    if(node.getLeftNode()!=null){
                        addNode(node.getLeftNode(),value);
                    }else{
                        node.setLeftNode(new Node(value));
                    }
                }else if(node.getValue()<value){
                    if(node.getRightNode()!=null){
                        addNode(node.getRightNode(),value);
                    }else{
                        node.setRightNode(new Node(value));
                    }
                }
            }
        }
        //查找节点
        public Node findNode(int value){
            System.out.println();
            if(rootNode==null){
                return null;
            }else{
                return findNode(rootNode,value);
            }
            
        }
        //递归查找节点
        private Node findNode(Node node,int value){
            
            if(node==null){
                return null;
            }
            System.out.print(node.getValue()+"=>");
            if(node.getValue()==value){
                return node;
            }else {
                Node n = null;
                if(node.getValue()>value){
                    n = findNode(node.getLeftNode(),value);
                }
                if(node.getValue()<value){
                    n = findNode(node.getRightNode(),value);
                }
                return n;
            }
        }
        
        //删除节点
        public void delete(int value){
            delete(rootNode,value);
        }
        
        //递归查找删除节点
        private void delete(Node node,int value){
            if(node==null){
                return;
            }
            if(node.getValue()>value){
                if(node.getLeftNode()==null){
                    return;
                }else{
                    if(node.getLeftNode().getValue()==value){
                        if(node.getLeftNode().getLeftNode()==null&&node.getLeftNode().getRightNode()==null){
                            node.setLeftNode(null);
                        }else if(node.getLeftNode().getLeftNode()==null&&node.getLeftNode().getRightNode()!=null){
                            node.setLeftNode(node.getLeftNode().getRightNode());
                        }else if(node.getLeftNode().getLeftNode()!=null&&node.getLeftNode().getRightNode()==null){
                            node.setLeftNode(node.getLeftNode().getLeftNode());
                        }else if(node.getLeftNode().getLeftNode()!=null&&node.getLeftNode().getRightNode()!=null){
                            Node p = node;
                            Node d = node.getLeftNode();
                            Node l = node.getLeftNode().getLeftNode();
                            Node r = node.getLeftNode().getRightNode();
                            if(r.getLeftNode()==null){
                                p.setLeftNode(r);
                                r.setLeftNode(l);
                            }else{
                                Node sp = getRL(r);
                                Node s = sp.getLeftNode();
                                sp.setLeftNode(s.getRightNode());
                                s.setLeftNode(l);
                                s.setRightNode(r);
                                p.setLeftNode(s);
                            }
                        }
                    }else{
                        delete(node.getLeftNode(),value);
                    }
                }
            }
            if(node.getValue()<value){
                if(node.getRightNode()==null){
                    return;
                }else{
                    if(node.getRightNode().getValue()==value){
                        if(node.getRightNode().getLeftNode()==null&&node.getRightNode().getRightNode()==null){
                            node.setRightNode(null);
                        }else if(node.getRightNode().getLeftNode()==null&&node.getRightNode().getRightNode()!=null){
                            node.setRightNode(node.getRightNode().getRightNode());
                        }else if(node.getRightNode().getLeftNode()!=null&&node.getRightNode().getRightNode()==null){
                            node.setRightNode(node.getRightNode().getLeftNode());
                        }else if(node.getRightNode().getLeftNode()!=null&&node.getRightNode().getRightNode()!=null){
                            Node p = node;
                            Node d = node.getRightNode();
                            Node l = node.getRightNode().getLeftNode();
                            Node r = node.getRightNode().getRightNode();
                            if(l.getRightNode()==null){
                                p.setRightNode(l);
                                l.setRightNode(r);
                            }else{
                                Node sp = getLR(l);
                                Node s = sp.getRightNode();
                                sp.setRightNode(s.getLeftNode());
                                s.setRightNode(r);
                                s.setLeftNode(l);
                                p.setRightNode(s);
                            }
                        }
                    }else{
                        delete(node.getRightNode(),value);
                    }
                }
            }
        }
        //递归查找右节点的左子节点树为空的节点
        private Node getRL(Node r){
            if(r.getLeftNode()!=null&&r.getLeftNode().getLeftNode()==null){
                return r;
            }else{
                return getRL(r.getLeftNode());
            }
        }
        //递归查找左节点的右子节点树为空的节点
        private Node getLR(Node l){
            if(l.getRightNode()!=null&&l.getRightNode().getRightNode()==null){
                return l;
            }else{
                return getLR(l.getRightNode());
            }
        }
        
        
        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,55,53,80};
            Serach2Tree serach2Tree = new Serach2Tree();
            for(int i=0;i<is.length;i++){
                serach2Tree.addNode(is[i]);
            }
            serach2Tree.findNode(65);
            serach2Tree.delete(60);
            serach2Tree.findNode(65);
        }
    }
     
  • 相关阅读:
    Python
    Java 内部类
    Django with uWSGI and nginx
    Android 使用AsyncTask 下载图片的例子,学会使用AsyncTask
    django QuerySet里那些常用又不常见的技巧
    android模拟器网络设置(局域网)
    iOS9 class dump header
    Qt之QHeaderView自定义排序(终极版)
    Qt之QHeaderView自定义排序(QSortFilterProxyModel)
    Qt之QHeaderView排序
  • 原文地址:https://www.cnblogs.com/TomSnail/p/4366239.html
Copyright © 2020-2023  润新知