zoukankan      html  css  js  c++  java
  • PAT 1127 ZigZagging on a Tree

    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

    #include<iostream>//根据中,后序建树,再层级遍历
    #include<vector>
    #include<queue>
    using namespace std;
    int n;
    vector<int> post(30, 0), in(30, 0);
    struct node{
    	int val;
    	node* left=NULL;
    	node* right=NULL;
    	node(int v):val(v), left(NULL), right(NULL){
    	}
    };
    node* buildtree(node* root, int inl, int inr, int postl, int postr){
    	if(inl>inr) return NULL;
    	root=new node(post[postr]);
    	int i=inl;
    	while(i<=inr&&in[i]!=post[postr]) i++;
    	int cnt=i-inl;
    	root->left=buildtree(root->left, inl, i-1, postl, postl+cnt-1);
    	root->right=buildtree(root->right, i+1, inr, postl+cnt, postr-1);
    	return root;
    }
    int main(){
    	cin>>n;
    	for(int i=0; i<n; i++)
    		cin>>in[i];
    	for(int i=0; i<n; i++)
    		cin>>post[i];
    	node* root=NULL;
    	root=buildtree(root, 0, n-1, 0, n-1);
    	queue<node*> q;
    	int flag=0, k=0, level=0;
    	q.push(root);
    	cout<<root->val;
    	while(!q.empty()){
    		vector<node*> v;
    		while(!q.empty()){
    			node *t=q.front();
    			q.pop();
    			if(t->left) v.push_back(t->left);
    			if(t->right) v.push_back(t->right);
    		}
            for(int i = 0; i < v.size(); i++)
                q.push(v[i]);
            if(level % 2 == 0)
                for(int i = 0; i < v.size(); i++)
                    printf(" %d", v[i]->val);
            else
                for(int i = v.size() - 1; i >= 0; i--)
                    printf(" %d", v[i]->val);
            level ++;
    	}
    	return 0;
    } 
    
    
  • 相关阅读:
    进制
    流程控制
    运算符
    格式化输出
    数据结构-树的遍历
    A1004 Counting Leaves (30分)
    A1106 Lowest Price in Supply Chain (25分)
    A1094 The Largest Generation (25分)
    A1090 Highest Price in Supply Chain (25分)
    A1079 Total Sales of Supply Chain (25分)
  • 原文地址:https://www.cnblogs.com/A-Little-Nut/p/9506584.html
Copyright © 2011-2022 走看看