算法--查找--二叉排序树创建、查找

二叉排序树(BST)具有如下性质:
(1)若有左子树,左子树所有值均小于根节点的值;
(2)若有右子树,右子树所有值均大于根节点的值;
(3)左右子树,分别是一棵二叉排序树。左子树中最右边节点必然是左子树中最大的,右子树最左边节点必然是右子树中最小的。

BST的创建和搜索还是比较简单的,思路基本一样,有树便有递归。比较棘手的是它的删除,相比于C语言的指针操作来说,java的赋值引用在此时就显得比较鸡肋,实现起来相对麻烦,待后续更新。

条件:

树上节点不能重复

原理:

二叉树的性质决定数据排布规律

实现:

一贯的原则,在保证尽量简洁的前提下,能上代码就不说话。

先附上一个工具类,主要用来遍历。

public class TreeUtils {

    public static void fir(Node node) {
        if (node != null) {
            System.out.print(node.data + " ");
            fir(node.left);
            fir(node.right);
        }
    }

    public static void mid(Node node) {
        if (node != null) {
            mid(node.left);
            System.out.print(node.data + " ");
            mid(node.right);
        }
    }

    public static void las(Node node) {
        if (node != null) {
            las(node.left);
            las(node.right);
            System.out.print(node.data + " ");
        }
    }

接下来便是BST的插入和搜索。

public class BST {

    /**
     * <p>name: main</p>
     * <p>description: </p>
     * <p>return: void</p>
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 依次将数组中的元素插入,默认没有重复数据
        int[] array = { 4, 2, 1, 0, 3, 5, 9, 7, 6, 8 };
        // 创建根节点;
        Node root = new Node(array[0]);
        for (int i = 1; i < array.length; i++) {
            insert(root, array[i]);
        }
        TreeUtils.fir(root);
        System.out.println("");
        TreeUtils.mid(root);
        System.out.println("");
        TreeUtils.las(root);     
    }

    /**
     * <p>
     * name: insert
     * </p>
     * <p>
     * description: (递归)插入,也就是创建。一共才16行代码,切记切记
     * </p>
     * <p>
     * return: void
     * </p>
     */
    public static void insert(Node node,int data){
        int key = node.data;
        if (key > data) {
            if (node.left == null) {
                node.left = new Node(data);
            } else {
                insert(node.left, data);
            }
        } else if (key < data) {
            if (node.right == null) {
                node.right = new Node(data);
            } else {
                insert(node.right, data);
            }
        }
    }

    /**
     * <p>
     * name: search
     * </p>
     * <p>
     * description: (递归)搜索。与插入的思路基本一样,一共才13行代码,切记切记
     * </p>
     * <p>
     * return: boolean
     * </p>
     */
    public static boolean search(Node node, int data) {
        if (node != null) {
            int key = node.data;
            if (key == data) {
                return true;
            } else if (key > data) {
                return search(node.left, data);
            } else if (key < data) {
                return search(node.right, data);
            }
        }
        return false;
    }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值