数据结构~基础2~树【《二叉树、二叉搜索树、AVL树、B树、红黑树》的设计】~二叉搜索树

简介: 数据结构~基础2~树【《二叉树、二叉搜索树、AVL树、B树、红黑树》的设计】~二叉搜索树

数据结构~基础2~树【《二叉树、二叉搜索树、AVL树、B树、红黑树》的设计】~二叉搜索树


 

一、 二叉搜索树:

❀ 二叉搜索树的特点:

● 整个二叉搜索树非常有特点,根大于左子树, 小于右子树

● 二叉搜索数的中序遍历是有序的~升序的

 

■ 继承了二叉树,在其基础上有了增删功能

❀ 二叉搜索树的通用接口:二叉树的通用接口 + 增加、删掉


7.png


■ 二叉搜索树增加和删除:

□ 从二叉搜索树的特点可以看出来,它是需要有比较机制的。

设计:内部是有一个比较器对象属性【用于接收用户传进来的比较器对象,当用户没有传入比较器时,使用强转,同理,让用户实现比较接口】:


//比较接口
    private int compare(E e1, E e2) {
        // 如果外界传入了一个比较器
        if (comparator != null) {
            // 使用比较器
            return comparator.compare(e1, e2);
        }
        return ((Comparable<E>) e1).compareTo(e2);
    }
//二叉搜索树public class BST<E> extends BT<E> {
    // 比较器对象
    private Comparator<E> comparator = null;
    //构造方法
    public BST() {
    };
    public BST(Comparator<E> comparator) {
        this.comparator = comparator;
    }
}


二叉搜索树增加接口

□  插入(添加)结点逻辑:从根结点开始,不断地比较【比根小,考虑左子树,比根大,考虑右子树,直到找到空位置【用于插入结点】

~~~插入时,判断是要添加到左结点还是右结点】


// 先找到父结点
        Node<E> parent = root;
        Node<E> node = root;    // 比较情况
        int cmp = 0;
        while (node != null) {
            cmp = compare(element, node.elmement);
            //更新待插入结点的父结点
            parent = node;
            if (cmp > 0) {
                node = node.right;
            } else if (cmp < 0) {
                node = node.left;
            } else { // 相等时,进行覆盖(因为如果是某个类对象进行比较的话,咱一般只用其某些属性进行比较,例如年龄相同的学生类:新传入的小虹可以覆盖掉小明)
                node.elmement = element;
                return;
            }
        }
        // node = new Node<E>(element, parent);
        Node<E> newNode = new Node<E>(element, parent);
        if (cmp > 0) {
            parent.right = newNode;
        } else {
            parent.left = newNode;
        }


■ 二叉搜索树删除接口

□  删除结点逻辑:【 删除本质上删除的是叶子结点

分类:

(1)删除度为2的结点:本质上删除的是它的前驱或者后驱【位置还是在叶子上】,

    覆盖法,将前驱或者后驱的值直接覆盖到待删除的结点位置的值,然后删除前驱或后驱

    前驱或者后驱结点【可能度为1,也可能度为0】(直接留给后边的情况(2、3)统一处理即可)

(2)删除度为1的结点:说明度为1的那个左结点或者右结点是叶子结点啦,找到删除结点的父结点,

   让父结点指向待删除结点的左结点【当待删除结点拥有的是左结点】或者右结点【当待删除结点拥有的是右结点】。

(3)删除度为0的叶子结点:直接让待删除结点的父节点指向空


if(node.hasTwoChildren()) {    //度为2
            Node<E> s = sucessor(node);
            node.elmement = s.elmement;
            node = s;
        }
        //来到这里就是开始删除度为 1 或者为 0 的结点
        //先考虑度为 1时 (要记得更改父结点)
        //用来替换的结点可能是待删除结点的左结点,也可能是右结点
        Node<E> replaceNode = node.left != null ? node.left : node.right;
        if(replaceNode != null) {    //度为 1
            // (要记得更改父结点)
            replaceNode.parent = node.parent;
            //考虑特殊情况(根的情况):
            if(replaceNode.parent == null) {
                root = replaceNode;
            }else if(node == node.parent.left) {    //度为1是其左孩子
                node.parent.left = replaceNode;
            }else {
                node.parent.right = replaceNode;
            }
        }else {    //度为 0
            //考虑特殊情况(根的情况):
            if(node.parent == null) {
                root = null;
            }else if(node.parent.left == node) {    //是叶子结点(是左边叶子)
                node.parent.left = null;
            }else {
                node.parent.right = null;
            }
        }



目录
相关文章
|
5月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
174 1
|
9月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
303 10
 算法系列之数据结构-二叉树
|
9月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
257 3
 算法系列之数据结构-Huffman树
|
9月前
|
存储 自然语言处理 数据库
【数据结构进阶】AVL树深度剖析 + 实现(附源码)
在深入探讨了AVL树的原理和实现后,我们不难发现,这种数据结构不仅优雅地解决了传统二叉搜索树可能面临的性能退化问题,还通过其独特的平衡机制,确保了在任何情况下都能提供稳定且高效的查找、插入和删除操作。
739 19
|
9月前
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
379 22
|
9月前
|
数据库 C++
【数据结构进阶】红黑树超详解 + 实现(附源码)
本文深入探讨了红黑树的实现原理与特性。红黑树是一种自平衡二叉搜索树,通过节点着色(红/黑)和特定规则,确保树的高度接近平衡,从而实现高效的插入、删除和查找操作。相比AVL树,红黑树允许一定程度的不平衡,减少了旋转调整次数,提升了动态操作性能。文章详细解析了红黑树的性质、插入时的平衡调整(变色与旋转)、查找逻辑以及合法性检查,并提供了完整的C++代码实现。红黑树在操作系统和数据库中广泛应用,其设计兼顾效率与复杂性的平衡。
1793 3
|
9月前
|
C语言 C++ 容器
【数据结构】二叉搜索树(二叉排序树)
本文介绍了二叉搜索树(Binary Search Tree, BST)的定义、实现及其性能分析。二叉搜索树是一种特殊的二叉树,其特点是左子树所有节点值小于根节点值,右子树所有节点值大于根节点值,且每个子树也满足此特性。文中详细讲解了BST的节点结构、插入、查找、删除等操作的实现,并通过C++代码展示了这些功能。此外,还讨论了BST的性能:在理想情况下,时间复杂度接近O(logN),但在最坏情况下可能退化为O(N)。为了提高效率,后续将学习自平衡二叉搜索树如AVL树和红黑树。掌握BST有助于理解STL中的set和map容器。感谢阅读,欢迎点赞支持。
801 9
|
11月前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
416 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
11月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
196 10
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
303 59