zoukankan      html  css  js  c++  java
  • [二叉树建树] 后序遍历与中序遍历建立二叉树

    1020. Tree Traversals (25)

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    16000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    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 <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    #include <queue>
    using namespace std;
    
    const int maxn=40;
    int post[maxn];
    int in[maxn];
    
    struct node
    {
        int data;
        node *lchild,*rchild;
    };
    
    node * creat(int postL,int postR,int inL,int inR)
    {
        if(postL>postR) return NULL;
        node * root=new node;
        root->data=post[postR];
        int index;
        for(index=inL;index<=inR;index++)
        {
            if(in[index]==post[postR])
            {
                break;
            }
        }
        int numLeft=index-inL;
        root->lchild=creat(postL,postL+numLeft-1,inL,index-1);
        root->rchild=creat(postL+numLeft,postR-1,index+1,inR);
        return root;
    }
    
    int first_flag=0;
    
    void layerOrder(node * root)
    {
        queue<node *> ans;
        ans.push(root);
        while(!ans.empty())
        {
            node * tmp=ans.front();
            ans.pop();
            if(first_flag!=0)
            {
                cout<<" ";
            }
            cout<<tmp->data;
            first_flag=1;
            if(tmp->lchild!=NULL) ans.push(tmp->lchild);
            if(tmp->rchild!=NULL) ans.push(tmp->rchild);
        }
    }
    
    int main()
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>post[i];
        }
        for(int i=0;i<n;i++)
        {
            cin>>in[i];
        }
        node * root;
        root=creat(0,n-1,0,n-1);
        layerOrder(root);
        return 0;
    }
  • 相关阅读:
    初级模拟电路:8-1 运算放大器概述
    初级模拟电路:6-1 FET概述
    初级模拟电路:5-5 甲乙类功率放大器
    初级模拟电路:5-4 乙类功率放大器
    初级模拟电路:5-3 变压器耦合型甲类功放
    初级模拟电路:5-2 串馈型甲类功放
    μC/OS-II系统中事件标志的使用
    STM32-SPI读写外部FLASH(W25Q64)
    STM32-定时器输出比较模式输出方波(DMA方式)
    STM32-定时器输出比较模式输出方波(中断方式)
  • 原文地址:https://www.cnblogs.com/xiongmao-cpp/p/6430988.html
Copyright © 2011-2022 走看看