zoukankan      html  css  js  c++  java
  • PAT 1127 ZigZagging on a Tree(30分)

    Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences. And it is a simple standard routine to print the numbers in level-order. However, if you think the problem is too simple, then you are too naive. This time you are supposed to print the numbers in "zigzagging order" -- that is, starting from the root, print the numbers level-by-level, alternating between left to right and right to left. For example, for the following tree you must output: 1 11 5 8 17 12 20 15.

    zigzag.jpg

    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 inorder sequence and the third line gives the postorder sequence. All the numbers in a line are separated by a space.

    Output Specification:

    For each test case, print the zigzagging sequence of the tree in a line. 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:

    8
    12 11 20 17 1 15 8 5
    12 20 17 11 15 8 5 1
    
    

    Sample Output:

    1 11 5 8 17 12 20 15
    

    思路

    • 在中序和后序构建二叉树的基础上,使用depth记录树深度,然后使用ans记录每层的结点,无论前序、中序、后序遍历,每一层的结点顺序都是一样的(先左子树后右子树)。使用maxDepth记录深度的最大值。

    代码

    #include <cstdio>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    const int maxn = 35;
    
    int n;
    int post[maxn], in[maxn], maxDepth = 0;
    vector<int> ans[maxn];
    
    void create(int inL, int inR, int postL, int postR, int depth)
    {
    	if (postL > postR)
    		return;
    	maxDepth = max(depth, maxDepth);
    	ans[depth].push_back(post[postR]);
    	int k = inL;
    	while (k <= inR && in[k] != post[postR]) k ++;
    	int num = k - inL;
    	create(inL, k - 1, postL, postL + num - 1, depth + 1);
    	create(k + 1, inR, postL + num, postR - 1, depth + 1);
    }
    
    int main()
    {
    	//freopen("test.txt", "r", stdin);
    	scanf("%d", &n);
    	for (int i = 0; i < n; i ++) scanf("%d", &in[i]);
    	for (int i = 0; i < n; i ++) scanf("%d", &post[i]);
    	
    	create(0, n - 1, 0, n - 1, 1);
    	printf("%d", ans[1][0]);
    	for (int i = 2; i <= maxDepth; i ++)
    	{
    		if (i % 2 == 1)
    			reverse(ans[i].begin(), ans[i].end());
    		for (int j = 0; j < ans[i].size(); j ++)
    			printf(" %d", ans[i][j]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    (C#)asp_net调试错误解决方法收集(1)
    asp.net调试技巧
    asp。Net 页面传值
    viewState详解
    Session,ViewState用法
    asp.net中通过form表单submit提交到后台的实例
    C#读写xml文件
    Asp.Net前台调用后台变量
    3. mybatis # 与 $ 的区别
    IDEA 中 使用 git(Git)
  • 原文地址:https://www.cnblogs.com/adios/p/12817716.html
Copyright © 2011-2022 走看看