• PAT 1020 Tree Traversals (后序中序求层序)


    Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.

    Input Specification:

    Each input file contains one test case. For each case, the first line gives a positive integer N (≤30), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.

    Output Specification:

    For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

    Sample Input:

    7
    2 3 1 5 7 6 4
    1 2 3 4 5 6 7
    

    Sample Output:

    4 1 6 3 5 7 2
    

    思路

    已知后序遍历、中序遍历的序列,求层序遍历。

    用一个队列,每次取出一个元素,把后序遍历的最后一个元素输出,然后将此元素在中序序列中的左半部分入队,右半部分入队。

    每次入队前,检查下长度是否合法(是否大于0)。

    (还是讨厌读大段大段的英文。。。

    代码

    #include <stdio.h>
    #include <string>
    #include <stdlib.h>
    #include <iostream>
    #include <vector>
    #include <string.h>
    #include <algorithm>
    #include <cmath>
    #include <map>
    #include <queue>
    #include <stack>
    #include <functional>
    #include <limits.h> 
    using namespace std;
    int a[40], b[40];
    struct node{
    	int s1, e1; // 后序序列的始末 
    	int s2, e2; // 中序序列的始末 
    	node(){
    	}
    	node(int _s1, int _e1, int _s2, int _e2){
    		s1 = _s1;		e1 = _e1;		
    		s2 = _s2;		e2 = _e2;
    	}
    };
    
    int main() {
    	int N;
    	cin >> N;
    	for(int i = 0; i < N; i++){		cin >> a[i];	}
    	for(int i = 0; i < N; i++){		cin >> b[i];	}
    	queue<node> mq;
    	mq.push(node(0, N - 1, 0, N - 1));
    	int flag = 0;
    	while(!mq.empty()){
    		node t = mq.front();
    		int s1 = t.s1, e1 = t.e1, s2 = t.s2, e2 = t.e2;
    		//cout << s1 << " " << e1 << " " << s2 << " " << e2 << endl;
    		mq.pop();
    		if(flag)	cout << " ";
    		flag = 1;
    		cout << a[e1] ;
    		if(e1 == s1)	continue;
    		int pos = s2;
    		while(b[pos] != a[e1]){	pos++; }
    		int len = pos - s2;	//左子树遍历长度 
    		if(len)		mq.push(node(s1, s1 + len - 1, s2, s2 + len - 1));
    		len = e2 - pos;	//右子树遍历长度 
    		if(len)		mq.push(node(e1 - len, e1 - 1, pos + 1, pos + len));
    	}
    	return 0; 
    }
    
    
  • 相关阅读:
    Java 的this和super关键字
    Java关于访问控制权限
    Java 封装 继承 多态
    Java的集成开发工具
    如何查询小程序中的代码量
    小程序中使用echarts及使用的坑
    微信小程序-新的页面授权机制
    前端处理几十万条数据不卡顿(window.requestAnimationFrame)
    Vs code中Eslint 与 Prettier格式化冲突
    从原型与原型链的角度看es6 class
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/12404501.html
Copyright © 2020-2023  润新知