03-树3 Tree Traversals Again (25分)

2024-03-06 09:38
文章标签 25 03 tree traversals

本文主要是介绍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 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 NN (3030) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to NN). Then 2N2N 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

主要思路:
1、从二叉树中序遍历非递归算法的进出栈顺序可以直接构造该二叉树
共6种情形
	 1、第一次Push(存根结点) 
	2、连续两次Push(本次Push的结点未上一次Push的结点的左孩子)
	3、上一次Push,本次Pop(上一次Push的结点无左孩子)
	4、上一次Pop,本次Push(本次push的结点为上次Pop的结点的右孩子)
	5、连续两次Pop(不处理)
	6、最后一次Pop(最后一次Pop的结点没有右孩子)
2、递归后序遍历输出结果
3、本题其它方法(由二叉树中序遍历非递归算法的进栈顺序可以得到该二叉树的前序遍历的结果。再按照前序遍历和中序遍历去推出后序遍历的结果)
 

#include<iostream>
#include<vector>
#include<string>using namespace std;#define Max_Node 32
typedef struct node
{int left;int right;
}Node;typedef struct stack//静态栈
{int Data[Max_Node];int Top;
}Stack;void Initialize_Stack(Stack& S)
{S.Top=0;
}void Push(Stack& S,int data)
{S.Data[S.Top++]=data;
}int Pop(Stack& S)
{return S.Data[--(S.Top)];
}void PostOrderTraverse(int data,vector<Node>& Tree);//后序遍历二叉树int main()
{Stack S;Initialize_Stack(S);vector<Node> Tree(Max_Node);int N;cin>>N;int number,Pre=0,Now=0,Pre_Num=0,root=0;string str;for (int i=0; i<2*N; ++i)//接受二叉树非递归中序遍历的输入时在线处理{cin>>str;if (str=="Push")//输入此行为Push,准备接收数字{cin>>number;if (root==0){root=1;root=number;}Push(S,number);Now=1;//当前行为Push操作if (Pre==1)//上一次为Push{Tree[Pre_Num].left=number;}if (Pre==2)//上一次为Pop{Tree[Pre_Num].right=number;}Pre=Now;Pre_Num=number;}else{number=Pop(S);Now=2;//本次操作为Popif (Pre==1){Tree[Pre_Num].left=-1;}if (Pre==2){Tree[Pre_Num].right=-1;}Pre=Now;Pre_Num=number;if (i==(2*N-1))//最后一个Pop结点的无右孩子{Tree[number].right=-1;}}}Tree[Max_Node-1].left=0;PostOrderTraverse(root, Tree);//后序遍历输出结果return 0;}void PostOrderTraverse(int data,vector<Node>& Tree)
{if (Tree[data].left!=-1){PostOrderTraverse(Tree[data].left, Tree);}if (Tree[data].right!=-1){PostOrderTraverse(Tree[data].right, Tree);}if (Tree[Max_Node-1].left==0)//Tree最后一个元素的左孩子用作标志位,用来保证输出格式{Tree[Max_Node-1].left=1;cout<<data;}else{cout<<' '<<data;}return;
}

这篇关于03-树3 Tree Traversals Again (25分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/779613

相关文章

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

树(Tree)——《啊哈!算法》

树 什么是树?树是一种特殊的图,不包含回路的连通无向树。 正因为树有着“不包含回路”这个特点,所以树就被赋予了很多特性。 一棵树中的任意两个结点有且仅有唯一的一条路径连通。一棵树如果有n个结点,那么它一定恰好有n-1条边。在一棵树中加一条边将会构成一个回路。 一棵树有且只有一个根结点。 没有父结点的结点称为根结点(祖先)。没有子结点的结点称为叶结点。如果一个结点既不是根结点也不是叶

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

【JavaScript】LeetCode:21-25

文章目录 21 最大子数组和22 合并区间23 轮转数组24 除自身以外数组的乘积25 缺失的第一个正数 21 最大子数组和 贪心 / 动态规划贪心:连续和(count)< 0时,放弃当前起点的连续和,将下一个数作为新起点,这里提供使用贪心算法解决本题的代码。动态规划:dp[i]:以nums[i]为结尾的最长连续子序列(子数组)和。 dp[i] = max(dp[i - 1]

Vue day-03

目录 Vue常用特性 一.响应更新 1. 1 v-for更新监测 1.2 v-for就地更新 1.3 什么是虚拟DOM 1.4 diff算法更新虚拟DOM 总结:key值的作用和注意点: 二.过滤器 2.1 vue过滤器-定义使用 2.2 vue过滤器-传参和多过滤器 三. 计算属性(computed) 3.1 计算属性-定义使用 3.2 计算属性-缓存 3.3 计算属

226 Invert Binary Tree

//226 Invert Binary Tree//算法思路:主要使用递归算法public class Solution {public TreeNode invertTree(TreeNode root) {//1 出口 空节点if (root==null)return null;//2 递归 调用自己TreeNode left = root.left;TreeNode right = ro

2025年25届计算机毕业设计:如何实现高校实验室Java SpringBoot教学管理系统

✍✍计算机毕业编程指导师** ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、Python、微信小程序、大数据实战项目集 ⚡⚡文末获取源码 文章目录 ⚡⚡文末获取源码高校实验室教学管理系统-研究背景高校实验室教学管理系

【SpringMVC学习03】-SpringMVC的配置文件详解

在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。其实真正需要程序员开发的就两大块:一个是Handler,一个是jsp。 在springMVC的入门程序中,SpringMVC的核心配置文件——springmvc.xml为: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http:

浙大数据结构——03-树1 树的同构

这道题我依然采用STL库的map,从而大幅减少了代码量 简单说一下思路,两棵树是否同构,只需比较俩树字母相同的结点是否同构,即是否左==左,右==右或者左==右,右==左。 1、条件准备 atree和btree是存两个数结点字母,第几个就存输入的第几个结点的字母。 map通过结点的字母作为键,从而找到两个子节点的信息 都要用char类型 #include <iostream>#inc

python+selenium2轻量级框架设计-03读取配置文件

任何一个项目,都涉及到了配置文件和管理和读写,Python支持很多配置文件的读写,这里介绍读取ini文件。 以读取url和浏览器作为例子 #浏览器引擎类import configparser,time,osfrom selenium import webdriverfrom framework.logger import Loggerlogger = Logger(logger='