zoukankan      html  css  js  c++  java
  • PAT Advanced 1086 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.
    Input Specification:
    Each input file contains one test case. For each case, the first line contains a positive integer N (<=30) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2N 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

    题目分析

    已知非递归中序(借助栈)遍历树的操作流程,求后序序列
    注:操作流程中push操作依次组成前序序列,又可以借助push和pop操作得到中序序列,题目即转换为中序+前序->后序

    解题思路

    思路 01

    1. 中序+前序建树
    2. 递归后序遍历树

    思路 02(最优)

    1. 中序+前序直接转后序序列

    知识点

    1. while(~scanf("%s",s)) {} //等价于scanf("%s",s)!=EOF

    两者作用是相同的
    ~是按位取反
    scanf的返回值是输入值的个数
    如果没有输入值就是返回-1
    -1按位取反结果是0
    while(~scanf("%d", &n))就是当没有输入的时候退出循环
    EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束。
    EOF 的值通常为 -1

    Code

    Code 01

    #include <iostream>
    #include <vector>
    #include <stack>
    using namespace std;
    vector<int> pre,in;
    int index,n;
    struct node {
    	int data;
    	node * left;
    	node * right;
    };
    node * create(int preL,int preR,int inL,int inR) {
    	if(preL>preR)return NULL;
    	node * now = new node;
    	now->data=pre[preL];
    	int k=inL;
    	while(k<inR&&in[k]!=pre[preL])k++;
    	now->left=create(preL+1, preL+(k-inL), inL, k-1);
    	now->right=create(preL+(k-inL)+1, preR, k+1, inR);
    	return now;
    }
    void postOrder(node * root) {
    	if(root==NULL)return;
    	postOrder(root->left);
    	postOrder(root->right);
    	printf("%d",root->data);
    	if(++index<n)printf(" ");
    }
    int main(int argc,char * argv[]) {
    	int id;
    	string s;
    	stack<int> sc;
    	scanf("%d",&n);
    	int len=n<<1;
    	for(int i=0; i<len; i++) {
    		cin>>s;
    		if(s=="Push") {
    			scanf("%d",&id);
    			pre.push_back(id);//preorder
    			sc.push(id);
    		}
    		if(s=="Pop") {
    			in.push_back(sc.top());
    			sc.pop();
    		}
    	}
    	node * root = create(0,n-1,0,n-1);
    	postOrder(root);
    	return 0;
    }
    

    Code 02(最优)

    #include <iostream>
    #include <vector>
    #include <stack>
    #include <cstring>
    using namespace std;
    vector<int> pre,in,post;
    int n;
    void postOrder(int preL,int preR,int inL,int inR){
    	if(inL>inR)return;// preL>preR也可以 
    	int k=inL;
    	while(k<inR&&in[k]!=pre[preL])k++;
    	postOrder(preL+1, preL+(k-inL), inL, k-1);//先存放左子节点 
    	postOrder(preL+(k-inL)+1, preR, k+1, inR);//后存放右子节点 
    	post.push_back(pre[preL]); //再存放父节点 
    } 
    int main(int argc,char * argv[]) {
    	int id;
    	char s[5];
    	stack<int> sc;
    	scanf("%d",&n);
    	while(~scanf("%s",s)) { //等价于scanf("%s",s)!=EOF 
    		if(strlen(s)==4) {
    			//Push
    			scanf("%d",&id);
    			pre.push_back(id);
    			sc.push(id);
    		} else {
    			//Pop
    			in.push_back(sc.top());
    			sc.pop();
    		}
    	}
    	postOrder(0,n-1,0,n-1);
    	for(int i=0;i<post.size();i++){
    		printf("%d",post[i]);
    		if(i!=post.size()-1)printf(" ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    EasyNVR视频平台无法输出RTSP流地址排查步骤
    EasyNVR平台实现播流地址超时无法播放功能过程分享
    EasyNVR视频平台集成出现播放一段时间后自动断开的情况排查及优化
    EasyNVR-ARM版云终端频繁死机重启原因分析
    EasyNVR用户登录修改为IP+用户名限制的修改过程分享
    EasyNVR视频平台设备通道页面显示错误的调整方法
    【解决方案】视频智能监控系统为酒店智能化建设提供一体化融合解决方案
    1051 Pop Sequence (25 分)
    1089 Insert or Merge (25 分)
    1085 Perfect Sequence (25 分)
  • 原文地址:https://www.cnblogs.com/houzm/p/12327575.html
Copyright © 2011-2022 走看看