二叉树的分层遍历、栈的压入弹出序列

news2024/9/20 5:32:57

        本章主要来讲解两个OJ题,针对每个OJ题我分三部分来解决,分别是题目解析(主要弄清楚题目要求我们解决什么问题),算法原理,代码编写,接下来让我们进入正题。

一、二叉树的分层遍历

1.题目解析

        题目的要求层序遍历,并且要将数据分层存储到数组中,所以需要一个二维数组做为返回值,而该题并不是简单的层序遍历,重难点在于如何把这些数据分层的存储到二维数组中,如何区分他们那层是那层?接下来看算法原理。

2.算法原理

        对于层序遍历(广度优先遍历)使用队列再合适不过了,首先把根节点放入队列中,然后出队,访问它的左右子节点并依次放入队列中,循环进行以上操作直到队列为空,这样就能够完成层序优先遍历,不过还有一个要点就是如何把数据分层存入二维数组中。

        要分层存储数据首先就需要分清楚数据分别在那层,那么我们可以用一个变量来记录每层数据的个数,用while来单独处理每一层,比如示例一,第一层的数据个数是1个,那么用一个循环(循环的次数即为该层数据的个数)处理完第一层的数据,然后队列里的数据个数(2个)即为第二层的数据个数,然后使用循环(循环的次数即为该层数据的个数)处理第二层的数据,依次类推,直到队列为空。

3.代码编写

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> qu;
        vector<vector<int>> arr;
        if(root)
            qu.push(root);
        while(!qu.empty())
        {
            int sum=qu.size();//记录每层数据个数
            vector<int> ar;
            ar.reserve(sum);//提前开好空间减少扩容次数,提高效率
            while(sum--)
            {
                TreeNode* rt=qu.front();
                ar.push_back(rt->val);
                qu.pop();
                if(rt->left)
                    qu.push(rt->left);
                if(rt->right)
                    qu.push(rt->right);
            }
            arr.push_back(ar);
        }
        return arr;
    }
};

二、栈的压入弹出序列

1.题目解析

题目意思是给一个压栈顺序,一个出栈序列,要求判断该压栈顺序能不能弹出这样出栈序列。                例如示例一:压栈顺序1 2 3 4 5,出栈顺序4 3 5 2 1,为了达到这种出站栈顺序可以是1 2 3 4 入栈,4出栈,3出栈,5入栈,5出栈,2出栈,1出栈。即push(1),push(2),push(3),push(4),pop(4),pop(3),push(5),pop(5),pop(2),pop(1)。

        示例二:压栈顺序1 2 3 4 5,出栈顺序4 3 5 1 2,为了达到这种出站栈顺序可以是1 2 3 4 入栈,4出栈,3出栈,5入栈,5出栈,然后只能是1出栈,2出栈,并不能模拟出所给的出栈效果,所以返回false。

2.算法原理

        通过上面的解析我们发现,只要随便给一组入栈出栈序列,我们可以根据栈的存储规则自行判断出是否匹配。判断方法就是模拟栈的存取过程,那么我们的算法设计可以模拟栈操作,就是把我们的判断方法用代码模拟一遍。

        模拟方法:准备一个空栈,准备两个指针p1和p2分别指向入栈和出栈序列的首元素下标。

        第一步:把p1指向数据入栈,p1后移。

        第二步:判断栈顶元素与p2指向元素是否相等,若相等则栈顶元素出栈,p2后移,然后再次判断栈顶元素与p2指向元素是否相等,以此方式重复进行直到不相等为止,进入第三部。

        第三部:重复第一步和第二部,直到p1移动到数组末尾,然后判断栈是否为空,若为空说明数据都匹配上了返回true,若不是则返回false。

3.代码编写

bool IsPopOrder(vector<int>& pushV, vector<int>& popV) 
{
    stack<int> stk;
    int p1=0,p2=0;
    while(p1<pushV.size())
    {
        stk.push(pushV[p1++]);
        while(!stk.empty()&&stk.top()==popV[p2])
        {
            stk.pop();
            p2++;
        }
    }
    return stk.empty();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VSCODE 使用正则表达式匹配替换有规律的行

需求描述 我有类似的文本 count count_l24 count_l32 count count count我需要逐行替换l24,l32所在行&#xff0c;其他行保留。 步骤 替换的时候找到正则表达式的选项 输入: ^._l.$ 替换为空行就行.

攻防世界-web题型-7星难度汇总-个人wp

Web_php_wrong_nginx_config 这个题目nginx配置错误 随便输入显示网站还没建设好。。。 先信息收集一下 换了个无敌好看的终端 没想到7星了还玩这些。。。 看了admin的页面需要先登录 现在的问题是如果读取到这个文件 这个hack的文件也没有东西 到此就不知道了&#xff0…

【二叉树---堆的C语言实现】

1.树的概念与结构 树是一种非线性的数据结构&#xff0c;它n&#xff08;N>0&#xff09;个有限节点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂着的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的节点&#xff0c;称为根节…

【基础算法】位运算

位运算 概念位运算模板模板题 概念 异或&#xff08;x⊕y或x ^ y&#xff09; 高低位交换:https://www.luogu.com.cn/problem/P1100 题意&#xff1a;给定一个32 3232位整数x xx&#xff0c;在二进制下交换其前16 1616位与后16 1616位&#xff0c;输出最终的数。 答案为ans (…

JVM系列--垃圾回收

在C/C这类没有自动垃圾回收机制的语言中&#xff0c;一个对象如果不再使用&#xff0c;需要手动释放&#xff0c;否则就会出现内存泄漏。内存泄漏指的是不再使用的对象在系统中未被回收&#xff0c;内存泄漏的积累可能会导致内存溢出。 在这段代码中&#xff0c;通过死循环不停…

besier打断和升阶,高阶性质

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 问题描述 对besier曲线在u处打断&#xff0c;生成两条besier曲线对besier曲线升阶处理 bezier高阶性质 求导推导 P ( t ) ∑ i 0 n B i n ( t ) b i \boldsymbol …

uniapp中H5网页怎么实现自动点击事件

<template><view><button ref"myButton" click"handleClick">点击我</button></view> </template><script> export default {mounted() {this.$nextTick(() > {const button this.$refs.myButton;console.l…

【系统分析师】-综合知识-计算机系统基础

1、流水线的吞吐率是指流水线在单位时间里所完成的任务数或输出的结果数。设某流水线有 5 段&#xff0c;有 1 段的时间为 2ns &#xff0c;另外 4 段的每段时间为 1ns&#xff0c;利用此流水线完成 100 个任务的吞吐率约为&#xff08;16&#xff09;个/s 。 2、矢量图像通过使…

Python+PyCharm安装和配置(详细步骤)

Python的安装步骤可以根据用户选择的安装方式&#xff08;如使用安装包安装或源码安装&#xff09;而有所不同。以下将详细讲解两种安装方式的步骤&#xff0c;并附上源码安装的相关说明。 一、使用安装包安装Python 1. 访问Python官网 打开浏览器&#xff0c;输入Python官…

Resilience4J服务熔断隔离与限流

为了保障文章的流畅性&#xff08;文章穿插大量的环境搭建没意思&#xff0c;会干扰文章的主题&#xff0c;无聊的很&#xff09;&#xff0c;将环境的搭建与测试&#xff0c;工具的版本说明放了文末&#xff1a; 六、环境搭建。 一、Circuit Breaker是什么 1.1、官网 https…

C++笔记---内存管理

1. 内存分布 在对操作系统有更加深入的了解之前&#xff0c;在写代码的层面我们需要对下面的几个内存区域有所了解&#xff1a; 1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。 2. 堆--用于程序运行时动态内存分配&#xff0c;堆是可以上增长…

【数据结构3】哈希表、哈希表的应用(集合与字典、md5算法和文件的哈希值)

1 哈希表 哈希表一个通过哈希函数来计算数据存 储位置的数据结构&#xff0c;通常支持如下操作: 插入(键&#xff0c;值):插入键值对(键&#xff0c;值) Get(key):如果存在键为键的键值对则返回其值&#xff0c;否则返回空值 删除(键):删除键为键的键值对哈希表(Hash Table&am…

数据仓库系列 2:数据仓库的核心特点是什么?

想象一下,你正站在一座巨大的数据金矿前。这座金矿蕴含着海量的商业洞察,可以帮助你的公司做出精准决策,提升效率,远超竞争对手。但是,如何高效地开采、提炼和利用这些数据黄金呢?答案就是:数据仓库。 目录 什么是数据仓库?数据仓库的核心特点面向主题的组织集成性非易失性…

RTL-SDR SpectrumPy频谱显示

GITHUB大佬开源的基于RTL-SDR的python频谱显示程序链接&#xff0c;下载下来后&#xff0c;安装必要的库&#xff0c;编译运行&#xff0c;运行报错。 修改了以下两个地方&#xff1a; 修改点1&#xff1a; 修改前&#xff1a; self.spinBoxFrequency.setValue(self.center_fr…

【Python从入门到进阶】63.Pandas如何实现数据的Merge

接上篇《62、Pandas中DataFrame对象案例实践》 上一篇我们延续之前学习的DataFrame对象的知识&#xff0c;结合一个数据案例进行了实践操作。本篇我们来学习Pandas如何实现数据的Merge。 一、引言 在当今数据驱动的时代&#xff0c;数据分析已成为各行各业不可或缺的一部分。…

【JAVA基础】四则运算符

文章目录 四则运算结合运算符自增运算符关系和boolean运算符 四则运算 在java当中&#xff0c;使用运算符、-、*、/ 表示加减乘除&#xff0c;当参与 / 运算的两个操作数都是整数的时候&#xff0c;表示整数除法&#xff1b;否则表示浮点数。整数的求余操作用 % 表示。 Syste…

【Java】/* 与树有关的一些概念 */

一、关于树的一些概念 1. 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&#xff1a;…

记录一次经历:使用flask_sqlalchemy集成flask造成循环导入问题

前言&#xff1a; 工作需求&#xff0c;写一个接口&#xff0c;用Python来编写&#xff0c;我首先想到用flask小型框架来支撑&#xff0c;配置sqlalchemy来实现&#xff0c;但是在实现的过程中&#xff0c;发生循环导入问题 我想到用蓝图来解决此问题&#xff0c;但是仍然会出死…

UI测试使用webdriver-manager免安装浏览器驱动

引言&#xff1a; selenium传统的方式是下载浏览器对应的driver&#xff08;驱动&#xff09;&#xff0c;放到本地的指定位置&#xff0c;然后写代码加载这个driver&#xff08;驱动&#xff09;再执行相应的操作。 弊端&#xff1a; 传统方法存在两个麻烦的地方: 1.需要下…

安全面试常见问题任意文件下载

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 1.1 任意文件下…