二分搜索树实现

159 阅读1分钟

二分搜索树是有顺序的树,某节点T的左子树都小于T节点,T的右子树均大于T节点的值。 实现的关键代码为add操作,用递归很容易实现。

package tree;

/*
 * @Param
 * */
public class BST<E extends Comparable<E>> {
    private class Node {
        public E e;
        public Node left, right;

        public Node(E e) {
            this.e = e;
            left = null;
            right = null;
        }

    }

    private Node root;
    private int size;

    public BST() {
        root = null;
        size = 0;
    }

    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }
    /*
     * 第一种add代码相对复杂,逻辑更清晰
     * */
    /*
    public void add(E e){
        if (root==null){
            root=new Node(e);size++;
        }else add(root,e);
    }
    private void add(Node node, E e) {
        //终止条件: -- 多个终止条件---终止条件直接返回
        if (node.e.equals(e)) return;
        else if (node.e.compareTo(e)<0 && node.right==null){
            node.right=new Node(e);size++;
            return;
        }
        else if (node.e.compareTo(e)>0 && node.left==null){
            node.left=new Node(e);size++;
            return;
        }
        //规模减小
        if (node.e.compareTo(e)<0) add(node.right,e);
        else add(node.left,e);
    }*/
    
    public void add(E e) {
        root = add(root, e);
    }

    private Node add(Node node, E e) {
        //终止条件
        if (node == null) {
            size++;
            return new Node(e);

        }
        //规模减小,这里逻辑容易出错。
        if (e.compareTo(node.e) > 0)
             node.right = add(node.right, e);
        else if (e.compareTo(node.e) < 0)
             node.left = add(node.left, e);
        return node;

    }


}

contains方法

public boolean contains(E e){
        return contains(root,e);
    }

    private boolean contains(Node node, E e) {
        //2.终止条件
        if (node.e.compareTo(e)==0)
            return true;
        else if (node==null)
            return false;

        //1.规模减少1
        if (e.compareTo(node.e)>0)
            return contains(node.right,e);
        else //if (e.compareTo(node.e)<0)
            return contains(node.left,e);

    }

前序遍历(中序遍历,和后续遍历原理相同)

//前序遍历操作,递归方法
    public void preOder(){
        preOder(root);
    }

    public void preOder(Node node){
        //2.终止条件
        if (node==null)
            return;

        /*
        * 1.规模缩小。
        * 访问该节点---》访问该节点的左子树、和右子树。
         * */
        System.out.println(node.e);
        preOder(node.left);
        preOder(node.right);
    }

    /*
    * 简单写法
    * 推荐第一种递归写法,逻辑比较清晰。
    *
    * if(node!=null){
        System.out.println(node.e);
        preOder(node.left);
        preOder(node.right);
    * }
    *
    * */