搜索二叉树——BST

本文介绍了二叉搜索树(BST),一种为高效查找而设计的数据结构。通过继承普通二叉树特性并实现查找、插入和删除操作,BST确保左孩子小于当前节点,右孩子大于等于当前节点。删除操作分为删除叶子节点、单孩子节点和两个孩子节点的情况,重点讨论了删除有两个孩子节点的策略。虽然BST在查询上有优势,但频繁的插入和删除可能影响其性能。
摘要由CSDN通过智能技术生成

前言

搜索二叉树,又叫查找二叉树,顾名思义为了查找方便,定义的一种数据结构。一般的二叉树,要查找一个指定元素,就必须使用前、中、后、层序遍历直到找到匹配的元素。但在找到到目标元素时,它上面所有层元素都被遍历。如果我们存储元素的时候,左孩子存小于它的元素,右孩子存大于等于它的元素。那么我们在查找时就判断当前节点和目标元素大小:目标元素小于当前节点找它左孩子继续查找,大于当前节点找他右孩子,直到找到相等这就二分查找思想,瞬间时间复杂度缩短一半。

实现

继承普通二叉树的特征

继承普通二叉树的特征,新增包含、插入、删除。

public interface SearchTreeInterface<T> extends TreeInterface<T>{
   
    /**
     * 树种查找指定元素
     * @param entry
     * @return 树种找到指定对象返回true,否则返回false
     */
    public boolean contains(Comparable entry);

    /**
     * 树种提取指定元素
     * @return 返回树中查找到的对象,没有返回null
     */
    public Comparable getEntry(Comparable entry);

    /**
     * 树中增加新的元素,如果该元素与树中一个已存在的元素匹配,则用新元素替换这个对象
     * @param newEntry 待插入树的对象
     * @return 如果newEntry不在树中,插入该对象后返回null,如果存在树中,替换为newEntry
     * ,返回被替换的元素
     */
    public Comparable add(Comparable newEntry);

    /**
     * 从树中删除指定元素
     * @param entry
     * @return 如果不存在这样的对象返回null,存在删除,并返回删除的对象
     */
    public Comparable remove(Comparable entry);
}

构建树

节点仍是二叉树节点,构建二叉树仍然适用于搜索二叉树。只是节点元素要具备Comparable属性可比较,这样才能左小右大的存储。

public class BinarySearchTree<T> extends BinaryTree<T> implements SearchTreeInterface<T> {
   

    public BinarySearchTree(){
   
        super();
    }
    public BinarySearchTree(Comparable rootEntry){
   
        super();
        setRootNode(new BinaryNode(rootEntry));
    }

禁用setTree

setTree会让客户端构建非搜索二叉树的的树。

 /**
     * 禁用setTree,创建一颗非二叉查找树的树
     * @param rootElement
     */
    @Override
    public void setTree(T rootElement) {
   
        throw new UnsupportedOperationException();
    }
    @Override
    public void setTree(T rootElement, BinaryTreeInterface<T> leftTree, BinaryTreeInterface<T> rightTree) {
   
        throw new UnsupportedOperationException();
    }

查找

  /**
     * 查找树中指定元素
     * @param rootNode 以rootNode为根节点的子树或者树根。
     * @param entry 要查找的元素
     * @param returnObject 记录待删除元素的父节点,以便改变左右节点指向来删除
     * @return 返回树中查找到元素的节点
     */
    private BinaryNode<T> findEntry(BinaryNode<T> rootNode,Comparable entry,ReturnObject returnObject){
   
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值