二分搜索树添加、查询节点-java

 

 

 叶子结点没有左右节点,有子节点不算叶子节点,根节点没有父节点

 

 

28>22>16>13					28<29<30<42

 

 可以在泛型里添加一条规矩,必须实现Comparable接口,保证具有可比较性

public class BST<E extends  Comparable<E>> {
}

 二分搜索树添加节点,如果小于根节点则添加到左子树,如果大于根节点添加到右子树。

 

比如从上图中的二分搜索树中添加一个值为60的节点

60>41则去41的右子树——》60>58则去58的右子树——》因为58的右子树为空,则60成为58的右节点

 

再添加一个值为28的节点:

28<41则去41的左子树——》28>22则去22的右子树——》28<33则去33的左子树——》因为33的左子树为空,则28为33的左节点

 

添加一个值为50的节点:

50>41去41的右子树——》50<58去58的左子树——》因为58的左子树刚好是50则二分搜索树不做任何变化 

 

 

 

/**
 * 二分搜索树,传入的泛型必须实现Comparable接口,保证具有可比较性
 */
public class BinarySearchTree<E extends Comparable<E>> {
    private Node root;//根节点
    private Integer size;

    /**
     * 添加元素
     *
     * @param e
     */
    public void add(E e) {
        //根节点为空则本次添加为首次添加
        if (root == null) {
            root = new Node(e);
            size++;
        } else
            this.add(root, e);//调用添加方法
    }

    /**
     * 向以node为根的二分搜索树中插入节点,递归算法.
     * 改进后,改进的理念是null也视为二分搜索树
     * 由于Node是内部类以及递归的特殊性设置为private
     *
     * @param node
     * @param e
     * @return
     */
    private Node add(Node node, E e) {
        if (node == null) {
            size++;
            return new Node(e);//返回要添加的节点
        }
        //递归部分,小于去左子树,大于去右子树,等于则什么都不做
        if (e.compareTo(node.e) < 0)
            node.left = this.add(node.left, e);//将递归返回结果添加到左节点
        else if (e.compareTo(node.e) > 0)
            node.right = this.add(node.right, e);//将递归返回结果添加到右节点
        return node;
    }

    /**
     * 用内部类屏蔽具体的实现细节
     */
    private class Node {
        public E e;
        public Node left, right;

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

在二分搜索树中查询一个元素是否存在与添加元素类似:

/**
 * 查询二分搜索树中是否包含此元素
 *
 * @param e
 * @return
 */
public Boolean contains(E e) {
    if (root == null)
        return false;
    else
        return this.contains(root, e);
}

/**
 * 递归查找二分搜索树中是否包含该元素
 * 由于Node是内部类以及递归的特殊性设置为private
 *
 * @param node
 * @param e
 * @return
 */
private Boolean contains(Node node, E e) {
    if (node == null)
        return false;//代表该二分搜索树中不存在该元素
    else if (e.compareTo(node.e) < 0)
        return this.contains(node.left, e);//小于去左子树找
    else if (e.compareTo(node.e) > 0)
        return this.contains(node.right, e);//大于去右子树找
    else
        return true;//等于则返回true
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值