03-树3 Tree Traversals Again(25 分)

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 阅读详情

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 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

Figure 1

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N(≤30)N (≤30)N(≤30) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to NNN). Then 2N2N2N 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>
#include <stdlib.h>
#define MAXN 30
#define OK 1
#define ERROR 0

int pre[MAXN], in[MAXN], post[MAXN];

//定义栈结构
struct SNode {
	int data;
	struct SNode *next;
};
typedef struct SNode *Stack;

//创建一个栈
Stack CreateStack() {
	Stack S;
	S = (Stack)malloc(sizeof(struct SNode));
	if(S) S->next = NULL;
	return S;
}

//判断栈是否为空
int IsStackEmpty(Stack S) {
	return S->next == NULL;
}

//入栈
void Push(Stack S, int data) {
	Stack p;
	p = CreateStack();
	p->data = data;
	p->next = S->next;
	S->next = p;
}

//出栈
int Pop(Stack S, int *result) {
	Stack p = S->next;
	if (IsStackEmpty(S)) return ERROR;
	*result = p->data;
	S->next = p->next;
	free(p);
	return OK;
}

//获取字符串中的数字
int GetInputNum(char input[]) {
	int result = 0, i, temp;
	for (i = 3; i < strlen(input); i++) {
		if (input[i] >= '0' && input[i] <= '9') {
			temp = (int)(input[i] - '0');
			result = result * 10 + temp;
		}
	}
	return result;
}

//解题函数
//构造post序列
//preL为pre数组起始下标
//inL为in数组起始下标
//postL为post数组起始下标
//n为总节点个数
void Solve(int preL, int inL, int postL, int n) {
	//root为根结点数据,L为左子树节点个数,R为右子树节点个数
	int root, i, L, R;
	if (n == 0) return;
	if (n == 1) {
		post[postL] = pre[preL];
		return;
	}
	//根结点数据为pre数组第一个元素的数据
	root = pre[preL];
	//post数组最后一个元素应为根节点的数据
	post[postL + n - 1] = root;
	//在in数组找到与根节点数据相同的元素下标
	for (i = 0; i < n; i++)
		if (in[inL + i] == root)
			break;
	L = i;
	R = n - L - 1;
	//对左子树求解
	//左子树pre数组起始位置应为根节点后一个位置(preL+1)
	//左子树in数组起始位置为根结点左侧,因此起始位置不变(inL)
	//左子树数据应在post数组最前面,因此起始位置不变(postL)
	//左子树总节点数为L
	Solve(preL + 1, inL, postL, L);
	//对右子树求解
	//右子树pre数组起始位置应为左子树最后一个元素的下一个位置(preL+L+1)
	//右子树in数组起始位置为根结点右侧,而根结点左侧有L个左子树的元素,因此确定位置(inL+L+1)
	//右子树数据应在post数组L个左子树部分的后一个位置(postL+L)
	//右子树总节点数为R
	Solve(preL + L + 1, inL + L + 1, postL + L, R);
}

//根据post数组输出结果
void PrintResult(int n) {
	int i;
	for (i = 0; i < n; i++) {
		if (i == 0) printf("%d", post[i]);
		else printf(" %d", post[i]);
	}
	printf("\n");
}

int main(void) {
	char input[100] = "\0", temp[100] = "\0";
	int N, i, preCount = 0, inCount = 0, popResult, num;
	Stack S = CreateStack();

	i = scanf("%d\n", &N);
	for (i = 0; i < 2 * N; i++) {
		gets_s(input);
		strncpy(temp, input, 3);
		temp[3 - 1] = 0;
		//入栈
		if (!strcmp(temp, "Pus")) {
			num = GetInputNum(input);
			Push(S, num);
			pre[preCount] = num;
			preCount++;
		}
		//出栈
		if (!strcmp(temp, "Pop")) {
			Pop(S, &popResult);
			in[inCount] = popResult;
			inCount++;
		}
	}
	Solve(0, 0, 0, N);
	PrintResult(N);

	return 0;
}
03-树2. Tree Traversals Again.zip 给你inorder的栈操作步骤,让你写出postorder后的序列。 http://blog.youkuaiyun.com/xkzju2010/article/details/46325457 立即下载

相关推荐

5G NR上行控制信道PUCCH

一、PUCCH概述 PUCCH用于承载上行控制信息,相比LTE,NR PUCCH支持5种不同的格式,按照时域上所占用的符号数量可以分为短格式和长格式两种,如下表所示,短格式占用1-2个符号,可以承载1-2bit信息,长格式占用4-14个符号,可承载大于2bit的信息。NR引入短格式PUCCH的目的是可以缩短HARQ-ACK反馈的时延,长格式仍然是考虑到持续时间长可以保证覆盖。 NR中,考虑到系...

一个关于5G NR的博客^^ 3万+

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

主动式桥梁防船撞预警系统的方案汇总

本系统以精密光电测高前端(2台,上下游各1台)、固态雷达(2台,上下游各1台)、AIS(1台)、偏航辅助前端(4台,上下游各2台)为核心,通过人工智能,对画面上的船舶目标进行深度学习、精确定位,再用系统集成方法将各设备有机结合在一起,构建成套的桥梁防撞主动预警系统,全天候监控过往船舶。主动式桥梁防船撞预警系统主要船舶监测采集单元、控制单元、船舶超高、偏航信息检测单元、以及视频监控单元组成,,通过声光警示、短信文字、船舶身份识别及海事对讲频道、视频录像取证等多种手段与船舶进行信息互动,主动防止船舶碰撞桥梁!

gdxixun的博客 970

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, t...

明朗晨光的专栏 524

单周期CPU设计【Verilog】

第一章 单周期CPU的设计原理 为实现单周期CPU,本文首先研究了单周期CPU的相关理论和工作原理。本章首先简要介绍单周期CPU的基本概念,然后对CPU的工作原理进行简要分析,以便为单周期CPU的设计和开发提供理论基础。 1.1 单周期CPU概述 中央处理器,即CPU,作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。在CPU内部,电平从低到高变化的瞬间称为时钟上升沿,两个相邻时钟上升沿之间的时间间隔称为一个时钟周期。单周期CPU指的是一条指令的执行在一个时钟周期内完成,然后开始下一

醉酒、冰城外 2万+

STM32U575 ADC+DMA+UART数据采集实战:CubeMX配置避坑与代码实现

在嵌入式开发中,ADC采集与DMA传输是提升系统实时性的关键技术。通过DMA将ADC数据直接搬运到内存,可大幅降低CPU占用,实现高效连续采样。结合UART的DMA发送,能进一步解放CPU,适用于工业采集、信号监测等场景。本文以STM32U575为例,详解CubeMX中ADC、DMA、UART的配置要点,包括时钟树、DMAMUX映射、循环模式等,并给出代码实现与常见问题排查,帮助开发者快速构建稳定的数据采集链路。

weixin_29194255的博客 169

03-树3 Tree Traversals Again【建树遍历】

还是建树。。。

GuoZLH的博客 780

三相交错并联的boost变换器simulink仿真,电流双闭环控制策略

文章介绍了一种基于Simulink的三通道交错并联双向Buck-Boost变换器的设计与仿真。该变换器采用电压外环和三电流内环的控制策略,并通过120°载波移相技术实现Buck模式与Boost模式之间的平滑切换,有效避免了过压和过流问题。交错并联的拓扑结构不仅减少了电感电流的纹波,还缩小了每相电感的体积,提升了电路的响应速度,适用于储能系统。仿真过程完全离散化,采用离散解析器,主电路与控制部分以不同步长运行,更贴近实际应用。控制与采样环节均为手工搭建,未使用Matlab自带模块,展示了三相交错并联Boost

2510_91195931的博客 1706

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 ...

qq_39339575的博客 721

手把手教你用Chrome DevTools逆向分析抖音a_bogus参数(附完整日志插桩方法)

本文详细介绍了如何使用Chrome DevTools逆向分析抖音a_bogus参数的生成逻辑,包括XHR断点定位、日志插桩追踪和加密核心逻辑解析。通过实战案例,帮助开发者掌握逆向工程技巧,应对抖音接口的动态加密变化,特别适合研究dy接口和a_bogus参数的技术人员。

weixin_27741699的博客 786

​基于stm32的智能空气加湿器设计(含源代码和Proteus仿真)

课程设计分享

LoongSTUDIO的博客 2925

03-树3 Tree Traversals Again (25分)

03-树3 Tree Traversals Again (25分) 思路分析:给出的样例就是说如果按照堆栈操作那么,出来的就是这个二叉树的中序遍历的结果,然后push操作的值就是二叉树前序遍历的结果,所以题目的意思就是,已知一个二叉树的中序遍历和前序遍历求得这个二叉树的后序遍历 每次在前序遍历中寻找根节点,然后从中序遍历中获取左子树和右子树的个数,然后再构造后序遍历数组,后序遍历数组的最后一位是根节点,然后每一次划分子树以后,那么该序列的最后一位也是 该子树的根, 采用递归逐渐将前序和中序遍历的结果划

m0_43429389的博客 194

大模型算法岗常见面试题100道

LangChain是一个用于构建和运行大型语言模型应用的开源框架。它提供了一套工具和组件,帮助开发者将大型语言模型(如 GPT-3)与其他工具和API结合,以完成更复杂的任务。1、LangChain包含哪些核心概念?Components:可重用的模块,例如API调用、数据库查询等。Chains:将多个Components链接在一起以完成特定任务的流程。Prompt Templates: 用于指导语言模型生成输出的文本模板。Output Parsers:解析语言模型输出的工具。

具身机器人和通用AI 1959

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 from 1 to 6) is traversed, the stack

dazhangyu97的博客 398

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 03-树2 List Leaves(25 分)
下一篇: 04-树4 是否同一棵二叉搜索树(25 分)
centralunit
博客等级 码龄10年 219粉丝 115原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值