zoukankan      html  css  js  c++  java
  • 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; 
    }
    
    
  • 相关阅读:
    HPU 1007: 严格递增连续子段(贪心)
    Codeforces Round #224 (Div. 2) A. Ksenia and Pan Scales
    Codeforces Round #224 (Div. 2) A. Ksenia and Pan Scales
    51Nod 1058: N的阶乘的长度(斯特林公式)
    51Nod 1090: 3个数和为0
    CSU 1112: 机器人的指令
    有关刷题时的多组输入问题
    HDU 1060:Leftmost Digit
    《算法导论》— Chapter 6 堆排序
    《算法导论》— Chapter 9 中位数和顺序统计学
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/12404501.html
Copyright © 2011-2022 走看看