【算法模板】利用维护栈实现二叉搜索树的迭代器

C++进阶:从基础二叉搜索树到自平衡AVL树的工程化实现 二叉搜索树(BST)是一种基础且重要的数据结构,其核心原理在于利用二叉树的有序性,通过节点键值的比较规则,实现数据的快速查找、插入与删除。在理想平衡状态下,这些操作的时间复杂度可达到O(log n),为高效数据检索提供了底层支持。然而,基础BST在工程实践中面临性能不稳定的挑战,例如在输入数据有序时可能退化为链表,导致效率骤降。为了确保性能的稳定性和可预测性,自平衡二叉搜索树应运而生,它通过旋转等操作动态维护树的平衡,是构建健壮数据引擎的关键技术。在C++工程实践中,将BST进阶为工业级组件,需要深入结合泛 阅读详情

原题 1305. 两棵二叉搜索树中的所有元素

我们可以利用栈这种数据结构保存每一个二叉搜索树中序遍历的当前状态

可以直接对这两个栈进行判断与操作

这里我参考评论区思路封装了一个迭代器,这样主函数的逻辑就比较清晰

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */

class DBTtreeIter{
    private:
    stack<TreeNode*> stk;
    TreeNode* root;
    public:
    DBTtreeIter(TreeNode* roots) : root(roots) {}

    int peek(){     //取二叉树当前的最小值
        while(root!=nullptr){
            stk.emplace(root);
            root = root -> left;
        }
        return stk.top()->val;
    }
    
    bool hasNest()     // 判断迭代器中还有没有下一个值
    {
        return root != nullptr || !stk.empty();
    }

    int next(){      // 迭代器移动到下一个值,并给一个当前值返回
        int res = 0;
        while(root!=nullptr||!stk.empty())
        {
            if(root!=nullptr)
            {
                stk.emplace(root);
                root = root -> left;
            }
            else{
                root = stk.top();
                stk.pop();
                res = root->val;
                root = root -> right;
                break;
            }
        }
        return res;
    }
};






class Solution {
public:
    vector<int> getAllElements(TreeNode* root1, TreeNode* root2) {
        vector<int> res;
        DBTtreeIter iter1(root1),iter2(root2);

        while(iter1.hasNest()&&iter2.hasNest())
        {
            if(iter1.peek()<iter2.peek()){
                res.emplace_back(iter1.next());
            }
            else{
                res.emplace_back(iter2.next());
            }
        }

        while(iter1.hasNest()) res.emplace_back(iter1.next());
        while(iter2.hasNest()) res.emplace_back(iter2.next());

        return res;
    }
};
从零实现C++ Set:AVL树原理、迭代器设计与工程实践 集合(Set)作为一种基础数据结构,其核心在于维护元素的唯一性并提供高效的查找、插入与删除操作。其实现原理主要分为基于比较的树形结构(如二叉搜索树)和基于哈希映射的哈希结构两大类。树形结构通过维护元素间的有序性,保证了数据的自然排序与稳定性能,其中平衡二叉搜索树(如AVL树、红黑树)通过旋转操作确保树高平衡,将操作时间复杂度控制在O(log n),从而在需要有序遍历或范围查询的场景中体现技术价值。在C++工程实践中,手动实现一个类STL的Set容器,不仅涉及AVL树的自平衡算法,还需深入处理迭代器设计、内存 阅读详情

相关推荐

二叉搜索树进阶:从基础实现到工业级应用与性能优化

二叉搜索树(BST)作为一种基础且重要的数据结构,其核心原理在于利用节点间的大小关系组织数据,以实现高效的查找、插入和删除操作。理解其工作原理是掌握更复杂树形结构(如AVL树、红黑树)的基石。在工程实践中,基础的BST常面临数据有序插入导致性能退化为O(n)的挑战,这凸显了引入平衡机制(如AVL树、红黑树)的技术价值,它们通过旋转等操作维持树的平衡,确保操作效率稳定在O(log n)。这类自平衡二叉搜索树广泛应用于需要高效动态数据管理的场景,例如数据库索引、内存缓存和实时排行榜系统。本文聚焦于如何将朴素的B

weixin_33404102的博客 270

bzoj 3190 维护栈

  我们可以将每一辆赛车看成一条直线,斜率为速度,纵截距为初始位置,那么问题就转化为求这n条直线处于最上面的直线。最上面是指在坐标系中,假设从x轴向下看,能看到的直线,只露一个点也算能看见。那么就类似水平可见直线这道题了。先按照斜率排序,然后维护直线的栈就行了。    /************************************************************...

weixin_34233679的博客 115

C++面试核心:STL容器、算法与数据结构实战解析

在C++编程与面试中,数据结构与算法是衡量开发者内功的核心标准。数据结构如数组、链表、树、哈希表等,是组织与存储数据的底层逻辑,直接决定了程序的时间与空间效率。算法则是操作这些数据、解决特定问题的步骤与思想,如排序、查找、递归、动态规划等,其核心价值在于通过优化计算过程来提升性能。在实际工程中,标准模板库(STL)提供了这些经典数据结构与算法的高效、通用实现,是C++开发者必须掌握的工具集。例如,vector的动态扩容机制、map基于红黑树的自动排序、unordered_map的哈希表实现,都是面试高频考点

weixin_30567225的博客 492

不得已一 维护一个栈并维护栈的最小元素getMin

github:https://github.com/cbamls 欢迎加入 (Java)全国各校IT精英 QQ群号: 467123855package com.offer.chapter1;import java.util.Stack;/** * CopyRright (c)2014-2016 Haerbin Hearglobal Co.,Ltd * Project: demo * Com

舒哥的blog 440

C++ STL核心机制解析:容器选型、迭代器失效与算法优化实战

泛型编程是C++标准库的核心设计思想,它通过模板技术实现了数据结构和算法的分离。其基本原理是使用迭代器作为统一接口,让算法可以独立于具体容器工作,从而极大提升了代码的复用性和灵活性。这一设计的技术价值在于,开发者无需重复实现基础数据结构,能专注于业务逻辑,同时保证了类型安全和运行效率。在实际应用场景中,无论是游戏引擎、高频交易系统还是嵌入式开发,合理运用STL都能显著提升开发效率和程序性能。其中,容器选型决策直接影响内存布局和操作时间复杂度,而迭代器失效问题则是导致程序崩溃的常见陷阱。掌握vector、ma

weixin_30420305的博客 385

C++模板与STL深度解析:从泛型编程到高效实战应用

泛型编程是一种将算法从特定数据结构中抽象出来的核心编程范式,它通过编写不依赖具体数据类型的通用代码来提升代码复用性。在C++中,这一思想通过模板技术得以实现,允许开发者创建可处理多种数据类型的函数和类。模板的技术价值在于其能够实现编译时多态,生成类型安全且高度优化的代码,从而避免运行时开销。基于模板构建的标准模板库(STL)是这一思想的集大成者,它将通用算法与数据结构分离,通过迭代器连接,提供了如vector、map、sort等高效组件,广泛应用于系统软件、游戏开发、高频交易等对性能有严苛要求的场景。理解模

weixin_33841722的博客 270

先序遍历非递归算法(手动维护栈)

void PreOrder(BTNode* root){ if (root == NULL) { return; } //Init Stack stack; stack.top = -1; //Root gets into stack BTNode* q; stack.top++; stack.data[stack.top] = root; //Process while (stack.top !.

行云流水 315

【数据结构与算法】第一篇:数据结构

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、变量(value)(1)整型(int)(2)浮点型(float\double)(3)字符型(char)(4)字符串型(string)(5)布尔型(bool)二、散列表/哈希表/键值对(Hash table)(1)散列表的定义(2)散列表的结构(3)散列表的功能(4)散列表的使用步骤(5)散列表的特征(6)散列表的实际应用三、数组(array)(1)数组的特征(2)数组的时间复杂

qq_35635374的博客 2488

STL的三驾马车:容器、迭代器、算法——C++98标准库的骨架

STL(标准模板库)是C++标准库的核心组件,采用"三位一体"架构:容器存储数据,迭代器作为访问桥梁,算法实现通用操作。容器分为序列容器、关联容器和容器适配器三类;迭代器按功能分为五类,连接算法与容器;算法则分为非修改性、修改性、排序和数值计算四类。这种设计实现了数据结构与算法的解耦,通过泛型编程提供高效灵活的组件体系,是现代C++编程的基础框架。

huahua8088的博客 1076

C++ Tree树结构模板库设计与实现

树容器的价值体现在其提供的基本操作上。本节重点解析三大核心操作——插入、删除与查找——的设计思想与实现路径,强调异常安全性、时间复杂度控制及递归/迭代选择策略。用户可通过lambda捕获上下文变量,实现复杂聚合:});二叉搜索树的核心在于其局部有序性决定全局有序性。具体而言,对于任意非空节点 $ N $,若其左子树存在,则左子树中所有节点的键值均严格小于 $ N $ 的键值;若其右子树存在,则右子树中所有节点的键值均严格大于 $ N $ 的键值。该性质必须在整个树的所有层级上递归成立。

weixin_29323977的博客 836

STL中文手册:C++标准模板库的深度解析与应用

STL(Standard Template Library,标准模板库)是C++语言中用于存储、检索和操作数据的一种方式,它提供了一组用于管理内存、数据结构和算法的模板集合。STL的引入,极大提升了C++处理通用数据和算法问题的效率和抽象层次,是现代C++编程不可或缺的一部分。STL提供了多个容器适配器:std::stackstd::queue和,它们为顺序容器提供额外的接口,实现特定类型的容器操作。std::stack提供后进先出(LIFO)栈容器的接口。std::queue。

weixin_36444661的博客 1255

二叉搜索树(BST)原理与C++高效实现指南

二叉搜索树(BST)是一种基于二叉树的高效查找数据结构,通过左小右大的节点分布规则实现O(log n)的查询效率。其核心原理是利用二分查找思想,将数据有序组织成树形结构,这种特性使其成为数据库索引、游戏AI决策等场景的理想选择。在C++实现中,需要特别注意内存管理和线程安全问题,通过智能指针、内存池等技术优化性能。BST不仅是STL中set/map的底层基础,也是学习更复杂平衡树结构(如AVL树、红黑树)的重要阶梯。掌握BST的插入、删除、查询等核心操作,能够帮助开发者构建高性能的数据处理系统。

weixin_34110749的博客 690

EtherCAT主站开发(学习笔记一)

摘要:本文介绍了基于STM32H7的EtherCAT主站开发探索。EtherCAT是一种高实时性工业以太网协议,具有低延迟、高带宽利用率等特点。文章详细解析了EtherCAT的协议架构、帧结构和工作原理,重点阐述了PDO数据传输过程及主从站通信机制。同时介绍了CoE、FoE等应用层协议扩展。作者将基于SOEM开源协议栈进行开发,为后续实际应用中的伺服电机控制奠定基础。

weixin_69388007的博客 1475

从二叉搜索树到C++ map:手把手实现关联容器的底层逻辑

关联容器是C++标准库中用于存储键值对的核心数据结构,其核心诉求在于兼顾动态数据的高效操作与元素的有序性。其底层原理通常基于平衡二叉搜索树,通过特定的平衡规则(如红黑树的颜色约束与旋转操作)来确保在最坏情况下仍能维持对数级的时间复杂度,从而为数据检索、插入与删除提供稳定高效的性能保障。这一设计在需要有序遍历或范围查询的场景(如数据库索引、配置管理、事件调度)中具有不可替代的技术价值。本文以C++ map为切入点,通过亲手实现一个简化版的MyMap,深入解析了二叉搜索树的节点设计、插入查找算法、删除操作的三种

weixin_30702441的博客 269

基于多模态融合的反无人机视觉跟踪算法研究

本研究提出了一种基于多模态融合的反无人机视觉跟踪算法,通过整合可见光、红外、深度等多种视觉信息源,提高了对无人机的跟踪精度和可靠性。设计并实现了多模态特征提取方法,针对不同模态图像的特点提取了有效的特征信息,为多模态融合提供了基础。研究了多种多模态融合策略,包括特征级融合、决策级融合和混合融合,并通过实验对比分析了它们的优缺点,确定了适合反无人机视觉跟踪的融合方法。选择并改进了跟踪算法,将多模态融合信息融入到跟踪过程中,提高了算法对复杂环境和无人机运动变化的适应性。

AI的内部世界的博客 1354

157、飞控中的鲁棒自适应控制

本文总结了飞控系统中鲁棒自适应控制的实践经验。作者通过炸机案例引出传统PID控制的局限性,分析了鲁棒性与自适应性的本质矛盾,提出"用鲁棒性兜底,用自适应性提性能"的设计原则。重点介绍了模型参考自适应控制(MRAC)的实现方法,包括参考模型设计、自适应律调参技巧(建议初始增益设为0.01)、直接/间接自适应的应用场景差异,以及防止参数漂移的鲁棒修正方法。文章还分享了实际调试中的三大关键问题(初始值设定、激励条件、执行器饱和)及解决方案,并推荐了"鲁棒PID+自适应前馈"的混合架构。最后强调调试顺序应为先保证鲁

2401_88858637的博客 28

C++非递归二叉搜索树实现:从原理到工业级代码实践

二叉搜索树(BST)是一种基于节点与指针构建的经典数据结构,其核心原理是通过有序的二叉树结构实现高效的数据查找、插入与删除操作。在性能敏感的开发场景中,递归实现的BST可能因栈溢出风险与函数调用开销而受限,而非递归实现则通过循环与显式指针操作,提供了更稳定可控的性能表现。这种底层控制能力对于理解内存管理、指针操作以及构建更复杂的数据结构(如AVL树、红黑树)具有重要技术价值。在C++面试与系统级开发中,掌握非递归BST的实现是评估开发者对数据结构底层逻辑理解深度的重要标尺。本文将以C++模板化实现为例,深入

weixin_30781775的博客 418

优快云 付费专栏连载第 3 篇|Cadence Allegro 8 层板布局实战教程:RK3568 硬件模块化分区布局,DDR4 内存约束区域设置、布局禁忌避坑指南

本文是 RK3568 8 层板高速 PCB 设计实战专栏的第 3 篇,聚焦 DDR4 布局阶段的核心方法论与 Allegro 实操。文章从布局前 6 项前置检查清单入手,系统讲解模块化分区布局的五大黄金原则,并给出 160mm×100mm 样板的 5 大功能分区实战案例。随后以图文步骤演示如何在 Allegro 中创建 ROOM_DDR4 与 ROOM_CPU 约束区域,并强调 Hard Room 硬约束的强制校验作用。

weixin_44520581的博客 1734

C++模板与STL:从泛型编程到高效容器算法的实战指南

泛型编程是C++实现代码复用和类型安全的核心范式,其原理在于通过模板将数据类型参数化,编译器在编译时根据具体类型生成特化代码。这一技术价值在于显著提升开发效率与代码可维护性,避免了为不同数据类型重复编写相似逻辑。在工程实践中,标准模板库(STL)基于泛型编程提供了工业级的数据结构与算法组件,例如vector、map和sort等,广泛应用于需要高性能容器和通用算法的场景,如游戏开发、算法竞赛和系统软件中。本文聚焦于C++模板机制与STL的深度解析,涵盖迭代器、容器选择策略及现代C++特性,帮助开发者掌握构建健

weixin_30905133的博客 316

化工仿真软件:gPROMS二次开发_(1).gPROMS基础知识

在gPROMS中,模型是通过定义变量、参数和方程来创建的。模型可以是简单的单元操作,如换热器、反应器,也可以是复杂的系统,如整个化工流程。变量是模型中表示状态或输出的量。在gPROMS中,变量需要显式定义其类型和单位。# 定义变量VAR# 温度变量,单位为K# 压力变量,单位为Pa# 组分摩尔分数,数组变量参数是模型中表示常量或初始条件的量。参数同样需要定义其类型和单位。# 定义参数PAR# 理想气体常数,单位为J/(mol·K)# 反应器体积,单位为m^3# 初始摩尔数。

kkchenjj的博客 618

轨迹优化 | 图解欧氏距离场与梯度场算法(附ROS C++/Python实现)

距离场在运动规划中则常用于地图建模和轨迹梯度优化。本文图解欧氏距离场EDT的算法原理,并基于双线性插值给出欧氏梯度场的公式推导,并给出ROS C++和Python的算法实现加深理解

FRIGIDWINTER的博客 4649

从红黑树原理到C++ Map/Set实现:平衡二叉搜索树的工程实践

平衡二叉搜索树是计算机科学中用于维护有序数据集合并支持高效查找、插入与删除操作的核心数据结构。其核心原理在于通过特定的平衡规则(如红黑树的颜色与路径约束)动态调整树形结构,确保树高保持对数级别,从而将操作时间复杂度稳定在O(log n)。这一特性在需要动态维护有序数据集且频繁进行增删查改的场景中具有极高的技术价值,例如数据库索引、内存键值存储、范围查询等。红黑树作为平衡二叉搜索树的一种经典实现,因其在插入与删除时所需的旋转操作相对较少,在工程实践中被广泛采用。C++标准库中的std::map和std::se

weixin_34337381的博客 483

[PCIE5.0] 2.2.8.9 Optimized Buffer Flush/Fill (OBFF) Message

这段文字讲解的是 优化的缓冲区清空/填充(OBFF)消息,它是 PCI Express(PCIe)规范中的一个可选功能,用于向设备报告平台中央资源的状态。简单来说,OBFF 主要帮助设备了解当前平台资源(如缓存或内存)的状态,从而优化数据的处理和传输。这章重点内容如下。

系统固件工程师 540

C++ STL核心组件解析:容器、迭代器与算法实战指南

在C++编程中,数据结构与算法是构建高效软件的基础。STL(Standard Template Library)作为C++标准库的核心组成部分,通过泛型编程思想,将常用的数据结构和算法抽象为可复用的模板组件。其设计原理基于容器、迭代器、算法的分离,实现了数据存储与操作的解耦,从而提升代码的通用性和性能。这一设计使得开发者能够专注于业务逻辑,而非底层实现细节,极大地提高了开发效率和代码质量。在工程实践中,STL的容器如vector、map等,配合迭代器和泛型算法,能够应对数组操作、查找排序、内存管理等高频需求

weixin_30883311的博客 406

【STM32Cube_14】使用硬件I2C读写环境光强度传感器(BH1750)

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750)

Mculover666的博客(嵌入式) 7243

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++ STL核心组件解析:容器、算法与迭代器实战指南

在C++编程中,数据结构和算法是构建高效软件的基础。标准模板库(STL)通过泛型编程思想,将常用的数据结构和算法抽象为可复用的组件,实现了数据与操作的分离。其核心包括容器(如vector、map)、算法(如sort、find)和迭代器三大部件,通过迭代器这一统一接口,算法可以独立于具体容器工作,极大提升了代码的通用性和可维护性。从工程实践角度看,理解不同容器的底层实现(如动态数组、红黑树、哈希表)及其时间复杂度特性,是进行性能优化的关键。例如,vector的连续内存特性对CPU缓存友好,而unordered

weixin_33754065的博客 324

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 各种编程文档中可选参数[, key]的意思
下一篇: 创建django项目(笔记)
Andy in boots
博客等级 码龄7年 73粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值