美文网首页
2020-03-15

2020-03-15

作者: joker_luo | 来源:发表于2020-03-15 21:36 被阅读0次

    1020 Tree Traversals (25分)

    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
    
    #include<iostream>
    #include<cstring>
    using namespace std;
    //本题就是用后序遍历和中序遍历唯一确定二叉树,输出二叉树的层次遍历。 
    int post[50];
    int inor[50];
    int level[10000];
    int main(){
        void pre(int root,int start,int end,int index);
        for(int i=0;i<10000;++i){
            level[i] = -1;
        }
        int nodes;
        cin>>nodes;
        for(int i=0;i<nodes;++i){
            cin>>post[i];
        }
        for(int i=0;i<nodes;++i){
            cin>>inor[i];
        }
        pre(nodes-1,0,nodes-1,0);
        int count = 0;
        for(int i=0;i<10000&&count<nodes;++i){
            if(level[i]!=-1&&count<nodes-1){
                printf("%d ",level[i]);
                count++;
            }else if(level[i]!=-1&&count==nodes-1){
                printf("%d",level[i]);
                break;
            }
        }
    }
    //先用后续遍历确定根节点,然后用根节点在中序遍历中进行划分。中序遍历不仅划分了左右子树,还划分了左右子树节点的个数。 
    //post后序遍历,inor中序遍历,start开始的数组下标,end结束的数组下标,index用于记录层次遍历。
    //调用时index为0表示根节点,递归时index为2*index+1左子树,2*index+2右子树。 
    void pre(int root,int start,int end,int index){
        //划分完毕时,start大于end,跳出 
        if(start>end)
            return;
        //下面语句进行划分,通过后续遍历确定的根节点,中序遍历将剩下的节点划分为左子树上的和右子树。
        int i = start;
        while(i<end&&inor[i]!=post[root]){
            i++;
        }
        //此次划分的根节点保存下来。 
        level[index] = post[root]; 
        //递归左子树,右子树。 
        //root-(end-i+1)为左子树的节点数,也是根节点。
        //如果使用i-1作为root传入时,哪会跳出这段长度。 
        pre(root-(end-i+1),start,i-1,2*index+1);
        pre(root-1,i+1,end,2*index+2);
    }
    
    

    相关文章

      网友评论

          本文标题:2020-03-15

          本文链接:https://www.haomeiwen.com/subject/hstiehtx.html