树3 Tree Traversals Again

《数据结构》03-树3 Tree Traversals Again An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stac... 阅读详情

An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3); pop(); pop(); push(4); pop(); pop(); push(5); push(6); pop(); pop(). Then a unique binary tree (shown in Figure 1) can be generated from this sequence of operations. Your task is to give the postorder traversal sequence of this tree.


Figure 1

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2 lines follow, each describes a stack operation in the format: "Push X" where X is the index of the node being pushed onto the stack; or "Pop" meaning to pop one node from the stack.

Output Specification:

For each test case, print the postorder traversal sequence of the corresponding tree in one line. A solution is guaranteed to exist. All the numbers must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:

6
Push 1
Push 2
Push 3
Pop
Pop
Push 4
Pop
Pop
Push 5
Push 6
Pop
Pop

Sample Output:

3 4 2 6 5 1

#include <stdio.h>
#include <string.h> 

void ReadTree(int Pre[], int In[], int N);
void GetPost(int Pre[], int In[], int Post[], int preL,
                   int inL, int postL, int N);

int main(){
	int N;
	scanf("%d",&N);
	int flag = 0,Pre[30]={0},In[30]={0},Post[30]={0};
	ReadTree(Pre, In, N); 
	GetPost(Pre, In, Post, 0, 0, 0 ,N);
	for (int i = 0; i < N; ++i)
	{
		if(!flag) 
			{printf("%d",Post[i]);
			 flag++;
			}
		else printf(" %d",Post[i]);
	}
	return 0;
}
void ReadTree(int Pre[], int In[], int N){
	int tail1=0,tail2=0, flag=0, A[30]={0};
	int Stack[30]={0}; 
	char op[4];
	for(int i = 0; i< 2*N ; i++){
		scanf("%s",&op);
		if( ! strcmp(op,"Push")) 
			{ scanf("%d",&Stack[flag]);               //构造前序遍历数组
			  Pre[tail1++] = Stack[flag];
			  flag++;
			}
		else  In[tail2++] = Stack[--flag];
							                         //构造中序遍历数组
}
}


void GetPost(int Pre[], int In[], int Post[], int preL,
                   int inL, int postL, int N)
{
    if (N == 0) return ;
    if (N == 1) {
        Post[postL] = Pre[preL];
        return ;
    }
    int root = Pre[preL];
    Post[postL + N - 1] = root;
    //在中序遍历数组上找出root的位置
    int i = 0;
    while (i < N) {
        if (In[inL + i] == root) break;
        ++i;
    }
    // 计算出root节点左右子树节点的个数
    int L = i, R = N - i - 1;
    // 递归的进行求解
    GetPost(Pre, In , Post, preL + 1, inL, postL, L);
    GetPost(Pre, In, Post, preL + L + 1, inL + L + 1, postL + L, R);
}

总结:

1.入栈顺序即为前序遍历,出栈顺序为中序遍历

2.  先读入并存储前序遍历数组和中序遍历数组,然后求后序遍历

3.   前序第一个值即为Root,也是后序数组最后一个值,同时Root将中序数组分割为左子树和右子树。 然后递归求解左子树和右子树。

对于Sample的求解结果为: 

1 
刚开始时,前序遍历的第一个元素1肯定是该二叉树的根节点,因此为postOrder的最后一个元素,在中序遍历中1前面的元素肯定为该颗二叉树的左子树在1右边的元素肯定为该二叉树的右子树,因此,递归的求解该二叉树。 

2 

参考资料:https://blog.youkuaiyun.com/shinanhualiu/article/details/49279051

03-树3 Tree Traversals Again (25分) 03-树3 Tree Traversals Again (25分)An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered f 阅读详情

相关推荐

生物信息学投稿避坑指南:如何根据影响因子和审稿速度选择最适合的期刊

本文为生物信息学研究者提供全面的期刊投稿策略,重点解析影响因子、审稿速度等关键指标,帮助选择最适合的期刊。涵盖算法开发类和应用型研究的投稿路径,分析不同出版社特点及开放获取的利弊,并提供投稿全流程优化建议,助力高效发表研究成果。

weixin_42652674的博客 380

03-树3 Tree Traversals Again(C语言) 一篇就让你弄懂

(网上找了一圈没有详细解答的,遂来补充) 先说思路:本题给出了一段由非递归实现的栈序列,由此按照此序列的操作可得到该树的中序遍历序列:3 2 4 1 6 5。但其实本题还包含了一个隐藏信息:我们回顾一下,先序遍历就是把第一次碰到的节点的值都打印出来。所以,本题中Push的节点的顺序,其实就是该树先序遍历的顺序,由此可得到先序遍历序列:1 2 3 4 5 6 (需要注意的一点,本题未说明节点的顺序一定是按照1 2 3 ...这样排列的) 所以,这道题的问题转化为:知道树的先序遍历序列和中序遍历序列,

qq_55563792的博客 2108

从零构建AI辅助逆向分析环境:JADX-MCP与LLM的实战集成指南

本文详细介绍了如何从零构建AI辅助逆向分析环境,通过集成JADX-MCP与LLM技术,提升Android应用逆向工程效率。文章涵盖环境搭建、插件安装、MCP服务器配置及实战案例分析,帮助开发者快速掌握AI在代码理解、漏洞挖掘和自动化文档生成中的应用。

weixin_27875131的博客 840

03-树3 Tree Traversals Again

03-树3 Tree Traversals Again 来自:PTA_数据结构_Tree Traversals Again An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tr...

王寒寒的博客 195

龙芯3A5000开发板PMON升级UEFI固件实战指南

固件是计算机硬件与操作系统之间的关键桥梁,负责初始化硬件并引导系统启动。其工作原理是在上电后执行自检、加载引导程序,最终将控制权移交操作系统。在国产化平台中,采用标准化的UEFI固件具有重要技术价值,它能提供图形化配置界面、统一硬件驱动模型,并支持安全启动等现代特性,从而显著提升硬件兼容性与系统管理效率。这一技术广泛应用于PC、服务器及嵌入式设备,尤其在需要运行银河麒麟等主流操作系统的龙芯开发板场景中,将传统PMON固件升级至UEFI,能实现更流畅的系统安装与更稳定的运行体验。本文基于固件升级与UEFI引导

weixin_42664597的博客 563

深入解析Zynq Ultrascale+ RF Data Converter中的PLL配置与时钟管理

本文深入解析了Zynq Ultrascale+ RF Data Converter中PLL配置与时钟管理的核心原理与实践。文章将RFDC时钟系统比作交响乐团,详细阐述了PLL作为指挥的关键作用,以及系统时钟、Tile时钟、参考时钟与采样时钟的层级关系。重点剖析了PLL配置参数(如VCO频率、分频器设置)的计算方法与稳定性考量,并提供了从IP配置使能顺序到多Tile同步、DRP访问等常见问题的实战避坑指南与调试技巧,帮助工程师构建稳定的射频信号处理基石。

7up55的博客 452

03-树3 Tree Traversals Again(C)

日常,25分,还有一个13分的错误。push(2);push(3);pop();pop();push(4);pop();pop();push(5);push(6);pop();Figure 1。

2301_80474443的博客 1190

CVAT自动标注避坑指南:从nuctl安装到YOLOv5模型部署的完整流程

本文详细介绍了在CVAT中部署YOLOv5自动标注功能的完整流程与避坑指南。重点解决了从nuctl工具安装、项目创建时因网络问题导致的镜像拉取失败,到最终模型函数部署与CVAT集成的关键步骤。针对国内网络环境,提供了实用的镜像替换方案,帮助用户顺利完成基于CPU的自动化标注环境搭建。

pytorch8learner的博客 229

树 三

文章目录6.堆(heap)6.1创建空最大堆6.2 将元素插入最大堆H6.3 删除最大根结点6.4最大堆的建立7.哈夫曼树(Huffman Tree)与哈夫曼编码7.1 哈夫曼的构造7.2 哈夫曼树的特点7.3哈夫曼编码8. 集合8.1集合的表示操作 6.堆(heap) 优先队列(Priority Queue):取出元素的顺序是按照元素的优先权大小,而不是元素进入队列的先后顺序 结构上用完全二叉...

虎哥的铲屎员 998

【ACP】2025-最新-疑难题解析- 练习二汇总

全球加速是优化公网访问的,负载均衡是分发流量的,公网 NAT 网关是处理公网 IP 的,高速通道是建私网连接但不直接提供固定私网地址功能。C 是客户端加密方式,D 是 ECS 云盘加密,都不属于 OSS 服务器端加密。某企业想使用云服务器 ECS + 负载均衡 SLB + 弹性伸缩 (Auto Scaling) 的架构搭建一个企业级门户网站,技术负责人对于负载均衡和弹性伸缩配合使用没有经验,于是将他理解的两种产品配合使用的一些技术细节列成了一个表单,并请作为架构师的您帮他做一下鉴别,以下哪些项是正确的?

jundao1997的专栏 297

Linux | Ubuntu18.04安装RTX 4060显卡驱动完整教程

本节详细介绍了如何在ubuntu18系统安装4060显卡的驱动。

九七的博客 5160

python数据结构之树(3)—— 哈夫曼树

入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。 一、哈夫曼树的概念 哈夫曼树也叫最优二叉树,在了解他的定义之前,我们先来看看以下这几个词的定义。 1、背景定义 ????路径:从树中一个节点到另一个节点间的分支构成这两个节点间的路径。 ????路径长度:路径上的分支数目。 ????树的路径长度:从树根到每一个结点的路径长度之和。在一条路径中,每经过一个结点,路径长度都要加 1,所以,如果规定根结点所在层数为1层,那么从根结点到第 k 层结点

tt丫的博客 7885

26版SPSS操作教程(高级教程第二十一章)

#专注方能成事 #本期内容:信度分析 #由于导师最近布置了学习SPSS这款软件的任务,因此想来平台和大家一起交流下学习经验,这期推送内容接上一次高级教程第二十章的学习笔记,希望能得到一些指正和帮助~

你好! 1713

算法 树3 Tree Traversals Again

题目:An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, th...

Dezeming的博客 7355

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: 树2 List Leaves
下一篇: 树4 是否同一棵二叉搜索树
DedicateToAI
博客等级 码龄9年 6粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值