二叉查找树

/*
 *  二叉查找树(binary search/sort tree,BST)是具有如下性质的二叉树:对于二叉树中的任意一个结点,
 *  如果它包含的数据元素为data,那么它的左子树(如果非空)只包含小于data的元素,并且它的右子树
 *  (如果非空)只包含大于或者等于data的元素。它是一种动态树表,树结构在插入元素时生成。
 * 
 * */

public class BSTree {

    // 假设结点值为整数
    private static class BSTNode {
        private int value;
        private BSTNode left;
        private BSTNode right;

        public BSTNode() {
        }

        public BSTNode(int value) {
            this.value = value;
        }

        public int getvalue() {
            return value;
        }

        public void setvalue(int value) {
            this.value = value;
        }

        public BSTNode getLeft() {
            return left;
        }

        public void setLeft(BSTNode left) {
            this.left = left;
        }

        public BSTNode getRight() {
            return right;
        }

        public void setRight(BSTNode right) {
            this.right = right;
        }
    }

    private BSTNode root;
    private int size;

    // 构造空二叉树
    public BSTree() {
        clear();
    }

    // 构造只有一个节点的二叉树
    public BSTree(int value) {
        root = new BSTNode(value);
    }

    public final void clear() {    // 不可覆写
        root = null;
        this.size = 0;
    }

    /*
     *  node:二叉树上的一个节点
     *  value:要操作的数据
     *  
     *  */
    public BSTNode insert(BSTNode node, int value) {
        if (node == null) {
            size++;
            if (root == null) {        // 是否是空二叉树,根节点有些特殊,它没有父节点也是二叉树的起点
                root = new BSTNode(value);
                return root;
            }
            return new BSTNode(value);
        } else {
            if (value < node.value) {
                node.left = insert(node.left, value);
            } else {
                node.right = insert(node.right, value);
            }
        }
        return node;
    }

    // 直接插入二叉树,自动寻找到插入位置
    public void insert(int value) {
        insert(root, value);
    }

    private BSTNode search(BSTNode node, int value) {
        if(node == null) {
            return null;
        } else {
            if(value == node.value) {
                return node;
            } else if(value < node.value){
                return search(node.left, value);
            } else {
                return search(node.right, value);
            }
        }
    }
    
    public boolean contains(int value) {
        return (search(root, value) != null);
    }

    /*
     * 前序:根-左-右
     * 中序:左-根-右,将会得到从小到大排列的结点序列
     * 后序:左-右-根
     * 
     * */
    private void midList(BSTNode node) {
        if (node.left != null) {
            midList(node.left);
        }
        System.out.print(node.value + ",");
        if (node.right != null) {
            midList(node.right);
        }
    }

    public void midList() {
        midList(root);
    }
    
    // 逆中序(右-根-左)打印,打印后的结果顺时针旋转90°就是正常的二叉树形状了
    /*
     * @param  
     *         node: 打印的节点
     *         depth: 打印节点的深度
     * */
    private void print(BSTNode node, final int depth) {
        if(node == null) {
            return;
        }
        print(node.right,depth+1);        // 注意这里不能用depth++或++depth
        for(int i = 0; i < depth; i++) {
            System.out.print("    ");
        }
        System.out.println(node.value);
        print(node.left,depth+1);
    }
    
    // 打印二叉树
    public void print(){
        print(root,0);
    }
    
    public int size() {
        return size;
    }
}
public class BSTreeTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        BSTree bst = new BSTree();
        int[] array = new int[] {6,4,9,1,8,3,10};
        for(int i : array) {
            bst.insert(i);
        }
        System.out.println(bst.contains(1));
        bst.midList();
//        bst.print();
    }

}
posted @ 2012-11-12 20:58  七天的空白  阅读(216)  评论(0编辑  收藏  举报