洛谷每日一题(P1229 遍历问题)

news2024/12/1 0:29:38

原题目链接:

P1229 遍历问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)  

原题目截图:

思路分析:

1、为什么会出现多个不同序列?

前序遍历和后序遍历序列无法唯一确定一棵二叉树的原因主要在于这两种遍历方式都缺少了关于树结构的某些关键信息。具体来说:

        前序遍历:访问顺序是“根-左-右”,即首先访问根节点,然后是左子树,最后是右子树。

        后序遍历:访问顺序是“左-右-根”,即首先访问左子树,然后是右子树,最后是根节点。

这两种遍历方式都有一个共同的问题:它们都没有明确指出左子树和右子树的边界。这意味着,给定一个前序遍历序列和一个后序遍历序列,可以有多种不同的二叉树结构对应于这两个序列。

2、什么情况下,不同的二叉树,它们有相同的前序遍历和后序遍历?

看下图的例子:

通过画图举例,我们可以很容易发现:

(1)这些不同的二叉树的层次遍历结果一定是相同的

(2)如果一个节点有两个儿子,那么这一层级之间结构不可变

(3)如果一个节点只有一个儿子,那么它可以通过改变这个儿子的左右属性,来变化二叉树结构

综上可以得到一个结论:只要知道有多少对“1对1”的节点(即只有一个儿子的节点)个数,就能够知道有多少不同二叉数。

假如“1对1节点个数”为x,那么结果输出^{^{^{^{^{^{^{}}}}}}}2^x。

3、如何知道“1对1节点个数”?

我们还是以上面的举例来看:

前序:abced

后序:ecdba

可以发现,对于“ab”,我们只要确认后序序列是否有“ba”,就可以判断出:a---b 一定是一组“一对一”连接。

相信说到这里,这道题就很容易了。

4、具体实现思路:我这里使用了哈希表优化了时间复杂度。

  1. 首先,我们读取前序遍历和后序遍历的序列。

  2. 然后,我们使用一个哈希表(unordered_map)来存储后序遍历中每个节点的位置。

  3. 接着,我们遍历前序遍历序列中的每个节点:

    • 对于每个节点,我们找到它在后序遍历中的位置。

    • 我们检查这个节点在后序遍历中左边是否有子节点(即index - 1 >= 0)。

    • 如果有,我们再检查这个子节点是否与前序遍历中下一个节点相同(即post[index - 1] == pre[i + 1])。

    • 如果相同,这意味着我们不能通过这两个序列唯一确定二叉树,因此我们将结果res乘以2。

  4. 最后,我们输出结果。如果结果是1,表示可以唯一确定二叉树;如果结果是2,表示不能唯一确定。

解决代码:

#include<iostream>
using namespace std;
#include<unordered_map>

int main() {
    string pre, post; // 定义前序遍历和后序遍历的字符串
    cin >> pre; // 输入前序遍历序列
    cin >> post; // 输入后序遍历序列

    unordered_map<char, int> ump; // 使用哈希表存储后序遍历中每个节点的位置
    for (int i = 0; i < post.size(); i++) {
        ump[post[i]] = i; // 将后序遍历中的节点和其索引存入哈希表
    }

    int res = 1; // 初始化结果为1,表示可以唯一确定二叉树
    for (int i = 0; i < pre.size(); i++) {
        int index = ump[pre[i]]; // 获取前序遍历中当前节点在后序遍历中的索引
        // 检查当前节点在后序遍历中左边是否有子节点,并且该子节点是否与前序遍历中下一个节点相同
        if (index - 1 >= 0 && i + 1 < pre.size() && post[index - 1] == pre[i + 1]) {
            res *= 2; // 如果相同,说明不能唯一确定二叉树,结果乘以2
        }
    }

    cout << res; // 输出结果
}

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

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

相关文章

linux基础 超级笔记

1.Linux系统的组成 Linux系统内核&#xff1a;提供系统最核心的功能&#xff0c;如软硬件和资源调度。 系统及应用程序&#xff1a;文件、任务管理器。 2.Linux发行版 通过修改内核代码自行集成系统程序&#xff0c;即封装。比如Ubuntu和centos这种。不过基础命令是完全相…

Android.mk中宏定义的高级用法剖析-安卓framework高级实战

背景&#xff1a; 前面的blog有讲解如何在Android.mk中进行控制安卓cpp源码中ifdef定义变量-干货技能分享&#xff0c;主要就是针对c代码中经常出现的#ifdef判断进行了剖析和实战 但是仅仅有上面的ifdef判断这个宏是否存在是不是对宏定义作用没有发挥到最大&#xff0c;是否可…

esp8266 at指令链接wifi时一直connect disconnest

那是你的连接wifi的名字密码有误或者热点有问题&#xff0c;看看热点是不是把设备拉入黑名单或者设置为5G或者连了校园网或者设置了最多链接设备

vAPI靶场

前言 自行去搭建vAPI靶场&#xff0c;配合postman使用 vapi1 创建用户 第一个用户 {"username": "shi","name": "shi1","course": "nihao","id": 10 } 第二个用户 {"username": "hui…

Pandas -----------------------基础知识(主要matplotlib知识)(七)

Dataframe变形 转置 T import pandas as pddata {2022: [10, 30, 15, 20], 2023: [40, 50, 36, 21]} df1 pd.DataFrame(data, index[q1, q2, q3, q4]) print("原始数据框&#xff1a;") print(df1)df2 df1.Tprint("转换后数据框&#xff1a;") print(df…

并查集——从LeetCode题海中总结常见套路

目录 并查集定义 LeetCode128.最长连续序列 先去重再sort&#xff1a; 改进去重的方法&#xff1a; 参考&#xff1a; 并查集定义 在计算机科学中&#xff0c;并查集是一种树型的数据结构&#xff0c;用于处理一些不交集&#xff08;Disjoint Sets&#xff09;的合并及查…

毕业设计选题:基于ssm+vue+uniapp的医院管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

管道内裂缝检测数据集 2000张 管道裂缝 带标注voc yol

管道内裂缝检测数据集 2000张 管道裂缝 带标注voc yol 管道内裂缝检测数据集 (Pipeline Crack Detection Dataset) 数据集概述 该数据集是一个专门用于训练和评估管道内裂缝检测模型的数据集。数据集包含2000张图像&#xff0c;每张图像都带有标注信息&#xff0c;标注格式为…

JavaScript中的高阶函数

高阶函数 所谓高阶函数&#xff0c;就是操作函数的函数&#xff0c;它接收一个或多个函数作为参数&#xff0c;并返回一个新函数&#xff1a; 来看一个mapper()函数&#xff0c;将一个数组映射到另一个使用这个函数的数组上&#xff1a; 更常见的例子&#xff0c;它接收两个函…

【Kubernetes】常见面试题汇总(五十六)

目录 123. pod 创建失败&#xff1f; 124. kube-flannel-ds-amd64-ndsf7 插件 pod 的 status 为 Init:0/1 &#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#x…

5G NR物理信号

文章目录 NR 物理信号与LTE的区别上行参考信号DMRS (UL)SRSPT-RS(UL) 下行参考信号DMRS(DL)PT-RS(DL)CSI-RSPSSSSS NR 物理信号与LTE的区别 用SSS、CSI-RS和DMRS 取代了CRS信号。下行业务信道采用TM1波束赋形传输模式。基于SSB 或者CSI-RS进行RSRP和SINR测量。基于DMRS 进行共…

Golang | Leetcode Golang题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; func circularArrayLoop(nums []int) bool {n : len(nums)next : func(cur int) int {return ((curnums[cur])%n n) % n // 保证返回值在 [0,n) 中}for i, num : range nums {if num 0 {continue}slow, fast : i, next(i)// 判断非零且方…

linux—进程控制

进程创建 使用fork函数可以在一个进程中创建一个子进程 fork函数 #include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() {printf("begin: 我是一个进程&#xff0c;pid: %d,ppid:%d\n",getpid(),getppid());pid_t id fo…

Java项目实战II基于Java+Spring Boot+MySQL的宠物咖啡馆平台的设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 在快节奏的城市生活中&#xff0c;宠物咖啡馆作为一种结合了休闲与宠物陪伴的新型业态&#xff0c;正…

数据服务-实时同步(sersync)

1. 概述 1.之前我们通过rsync定时任务实现定时备份/同步 2. 对于NFS我们需要进行实时同步 2. Sersync原理 3. 上手指南 环境主机web0110.0.0.7(nfs客户端)nfs0110.0.0.31(rsync客户端) (nfs服务端)backup10.0.0.41(rsync服务端) 3.1 rsync服务端准备 参考: 数据服务-备份服务…

[c++高阶] 继承深度剖析

1.前言 继承 是 面向对象三大特性之一&#xff08;封装、继承、多态&#xff09;&#xff0c;所有的面向对象&#xff08;OO&#xff09;语言都具备这三个基本特征&#xff0c;封装相关概念已经在《类和对象》系列中介绍过了&#xff0c;今天主要学习的是 继承&#xff0c;即如…

RTX4060+ubuntu22.04+cuda11.8.0+cuDNN8.6.0 如何根据显卡型号和系统配置cuda和cuDNN所需的安装环境

文章目录 &#x1f315;电脑原配置&#x1f315;安装cuda和cuDNN前的环境选择&#x1f319;cuDNN与CUDA tookit和nvidia driver的对应关系&#x1f319;cuda版本选择⭐查看自己的nvidia driver版本和最大支持的CUDA版本⭐最小支持版本 &#x1f319;查看11.8.0版本的cuda和ubun…

前端学习——CSS——李白代表作品页面(3)

上传资源的地方&#xff1a;http://download.csdn.net/ 项目要求部分&#xff08;1&#xff09; &#xff1a; 支撑知识点&#xff1a; 1.CSS附加方式——外部样式表&#xff1a; --->链接式外部样式表 语法&#xff1a; 在head标签里边写link单标签&#xff0c;其中再…

认知杂谈99《打工人 警惕 画饼》

内容摘要&#xff1a; 领导心理游戏是指领导者利用甜言蜜语和虚假承诺来操控员工情感&#xff0c;使员工产生依赖和盲目信任的行为。他们常以美好未来的描绘来吸引员工&#xff0c;但这些承诺往往难以实现。 员工之所以容易陷入这种心理游戏&#xff0c;是因为他们渴望得到情感…

Golang | Leetcode Golang题解之第455题分发饼干

题目&#xff1a; 题解&#xff1a; func findContentChildren(g []int, s []int) (ans int) {sort.Ints(g)sort.Ints(s)m, n : len(g), len(s)for i, j : 0, 0; i < m && j < n; i {for j < n && g[i] > s[j] {j}if j < n {ansj}}return }