树——二叉搜索树的实现

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);
    }
}
 
原文地址:https://www.cnblogs.com/TomSnail/p/4366239.html