PAT甲级(Advanced Level) Practice 1020 Tree Traversals

devtools/2025/3/16 13:32:54/

原题

1020 Tree Traversals - PAT (Advanced Level) Practice

题目大意

输入n表示二叉树的元素数量,再分别输入该树的后序和中序遍历,输出该树的层序遍历。

解题思路

想了很久也没想出来怎么直接把后序中序转化为层序,大家如果有直接转化的方法欢迎讨论交流!

本题先将后序中序遍历转化为二叉树,再层序遍历二叉树。要构建给定后序和中序遍历的二叉树,可以按照以下步骤进行:

  1. 确定根节点:后序遍历的最后一个元素是当前子树的根节点。
  2. 分割中序数组:在中序遍历中找到根节点的位置,将数组分为左子树和右子树。
  3. 递归构建子树:根据中序分割的结果,确定左子树和右子树的大小,并在后序数组中划分对应的部分,递归构建左右子树。

代码(c++)

#include <bits/stdc++.h>
#include <vector>
#include <map>
#include <queue>using namespace std;typedef struct BiTNode {        // 定义二叉树int data;BiTNode *lchild, *rchild;
}BiTNode, *BiTree;BiTNode* buildTreeHelper(vector<int>& postorder, int postStart, int postEnd, int inStart, int inEnd, unordered_map<int, int>& inMap) {if (postStart > postEnd || inStart > inEnd) return nullptr;// 创建根节点BiTNode* root = new BiTNode();root->data = postorder[postEnd];int inRoot = inMap[root->data];int leftSubtreeSize = inRoot - inStart;// 递归构建左子树root->lchild = buildTreeHelper(postorder, postStart, postStart + leftSubtreeSize - 1, inStart, inRoot - 1, inMap);// 递归构建右子树root->rchild = buildTreeHelper(postorder, postStart + leftSubtreeSize, postEnd - 1, inRoot + 1, inEnd, inMap);return root;
}BiTree buildTree(vector<int>& postorder, vector<int>& inorder) {if (postorder.empty() || inorder.empty() || postorder.size() != inorder.size()) {return nullptr;}// 创建中序遍历的哈希映射,以便快速查找根节点位置。unordered_map<int, int> inMap;for (int i = 0; i < inorder.size(); ++i) inMap[inorder[i]] = i;return buildTreeHelper(postorder, 0, postorder.size() - 1, 0, inorder.size() - 1, inMap);
}void LevelOrderTraversal(BiTree root) {        // 层序遍历二叉树if (root == nullptr) return;queue<BiTNode*> q;q.push(root);cout << root->data;while (!q.empty()) {BiTNode* current = q.front();  q.pop();if (current != root) cout << " " << current->data;if (current->lchild != nullptr)q.push(current->lchild);if (current->rchild != nullptr)q.push(current->rchild);}
}int main() {int n;cin >> n;vector<int> postorder, inorder;for(int i = 0; i < n; i++) {int x;cin >> x;postorder.push_back(x);}for(int i = 0; i < n; i++) {int x;cin >> x;inorder.push_back(x);}BiTree root = buildTree(postorder, inorder);LevelOrderTraversal(root);
}

http://www.ppmy.cn/devtools/167571.html

相关文章

微信小程序wx.request接口报错(errno: 600001, errMsg: “request:fail -2:net::ERR_FAILED“)

来看看报错 报错如下: 请求发送部分,代码如下: uni.request({url: self.serverUrl "/getRealName",method: GET,data: {"code": self.info.code,},header: {"Authorization": uni.getStorageSync(tokenHead) uni.getStorageSync(token)}}…

浏览器指纹——跨境业务

一、什么是浏览器指纹&#xff1f; 浏览器指纹&#xff08;Browser Fingerprinting&#xff09;是一种用于识别和追踪用户设备的技术。不同于 Cookie 或 IP 地址&#xff0c;浏览器指纹不会直接存储在用户设备上&#xff0c;而是通过收集用户的浏览器信息、字体、屏幕分辨率、…

Windows 11 安装Docker Desktop环境

1、确认CPU开启虚拟化 打开任务管理器&#xff0c;切换到“性能”选项卡&#xff0c;查看 CPU 信息。若“虚拟化”状态显示为“已启用”&#xff0c;则表示虚拟化已开启&#xff1b;若显示为“已禁用”&#xff0c;则需要在启动时进入 BIOS 开启虚拟化设置&#xff08;若显示已…

【Quarkus】通过Quarkus集成后端服务示例

说明&#xff1a; REST资源接口&#xff08;AuthResource&#xff09;。REST资源实现类&#xff08;AuthResourceImpl&#xff09;。服务接口&#xff08;AuthService&#xff09;。服务实现类&#xff08;AuthServiceImpl&#xff09;。配置文件&#xff08;application.prop…

基于 GEE 利用 Sentinel-1 双极化数据计算 SDWI 指数实现逐月提取水域面积

目录 1 SDWI 指数 2 研究方法及数据处理 3 完整代码 4 运行结果 1 SDWI 指数 Sentinel-1双极化数据SDWI水体提取指数公式&#xff1a;SDWI ln ⁡(10VVVH) Sentinel-1 Dual-Polarized Water Index (SDWI)水体信息提取方法对 Sentinel-1 双极化数据(VV 和 VH)之间水体信息…

【图像处理】ISP(Image Signal Processor) 图像处理器的用途和工作原理?

ISP&#xff08;图像信号处理器&#xff09;是数字影像设备的“视觉大脑”&#xff0c;负责将传感器捕获的原始电信号转化为我们看到的高清图像。以下从用途和工作原理两方面通俗解析&#xff1a; 一、ISP的核心用途&#xff1a;让照片“更像眼睛看到的” 提升画质&#xff1a…

​技术解析麦萌短剧《阴阳无极》:从「性别偏见下的对抗训练」到「分布式江湖的架构重构」​

《阴阳无极》以陈千叶的武道觉醒为线索&#xff0c;展现了传统系统的路径依赖困境与对抗性策略的范式突破。本文将从算法博弈视角拆解这场武侠革命的底层逻辑&#xff0c;探讨如何在性别偏见的数据集中完成模型的自我进化。 ​1. 初始模型偏差&#xff1a;继承权剥夺与梯度冻结…

计算机网络开发--阻塞与非阻塞、同步与异步、http协议

阻塞与非阻塞 和 同步与异步 典型的一次IP的两个阶段&#xff1a;数据就绪和数据读写 数据就绪:根据系统IO操作的就绪状态 系统就绪分为阻塞和非阻塞。 如果是阻塞操作&#xff0c;那么当前线程会被挂起&#xff0c;等待资源准备好。在此期间&#xff0c;CPU会切换到其他线程…