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)N (\le30), 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

题目大意

给出一个二叉树的后序遍历和中序遍历,输出该二叉树的层次遍历结果。

思路

数据结构模板题,我采用常规思路,先建树再遍历,可以先手动模拟建树过程,寻找规律,

后序 2 3 1 5 7 6 4
中序 1 2 3 4 5 6 7
先根据后序找到根节点,再在中序中找到根节点的左右子树
后序 2 3 1 5 7 6 4
中序 1 2 3 4 5 6 7
此时4的左子树右三个节点(1,2,3),右子树有3个节点(5,6,7),对于左子树,其根节点为1,对于右子树,其根节点为6,这样就能得到4的左右子树,再将左右子树又分别看作一棵树,执行重复的过程,显然这是一个递归的过程;

每趟递归都要计算当前节点左右子树的个数,这里用visited[]标记当前节点是否已经添加到树中,当左或右子树节点个数为0时,表示该节点无左子树或无右子树,也是递归结束条件,当节点数不为0时执行下一趟递归,具体建树过程如下:

void createTree(node *root, int r){ //root父亲节点
    int rindex;
    for(int i=0; i<n; i++)
        if(inorder[i] == postorder[r]){
            rindex = i;
            break;
        }
    visited[rindex] = true;//表示访问
    int lcn = 0, rcn = 0;
    for(int i=rindex-1; !visited[i]&&i>=0; i--) //统计左子树个数
        lcn++;
    for(int i=rindex+1; !visited[i]&&i<n; i++)	//统计右子树个数
        rcn++;
    if(lcn == 0)		//左子树为空,递归结束
        root->left = NULL;
    else{				//不为空,下一趟递归
        node *lc = new node;
        lc->data = postorder[r-rcn-1];
        root->left = lc;
        createTree(lc, r-rcn-1);
    }
    if(rcn == 0)
        root->right = NULL;
    else{
        node *rc = new node;
        rc->data  =postorder[r-1];
        root->right = rc;
        createTree(rc, r-1);
    }
}

完整代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

struct node{
    int data;
    node *left;
    node *right;
};

int n;
int postorder[30];
int inorder[30];
int visited[30] = {false};

void createTree(node *root, int r){
    int rindex;
    for(int i=0; i<n; i++)
        if(inorder[i] == postorder[r]){
            rindex = i;
            break;
        }
    visited[rindex] = true;
    int lcn = 0, rcn = 0;
    for(int i=rindex-1; !visited[i]&&i>=0; i--)
        lcn++;
    for(int i=rindex+1; !visited[i]&&i<n; i++)
        rcn++;
    if(lcn == 0)
        root->left = NULL;
    else{
        node *lc = new node;
        lc->data = postorder[r-rcn-1];
        root->left = lc;
        createTree(lc, r-rcn-1);
    }
    if(rcn == 0)
        root->right = NULL;
    else{
        node *rc = new node;
        rc->data  =postorder[r-1];
        root->right = rc;
        createTree(rc, r-1);
    }
}

int main(){
    scanf("%d", &n);
    for(int i=0; i<n; i++)
        scanf("%d", &postorder[i]);
    for(int i=0; i<n; i++)
        scanf("%d", &inorder[i]);
    node root;
    root.data = postorder[n-1];
    createTree(&root, n-1);
    queue<node> que;
    que.push(root);
    while(!que.empty()){
        node tmp = que.front();
        que.pop();
        cout<<tmp.data;
        if(tmp.left != NULL)
            que.push(*tmp.left);
        if(tmp.right != NULL)
            que.push(*tmp.right);
        if(!que.empty())
            cout<<" ";
    }
    return 0;
}

发布了31 篇原创文章 · 获赞 24 · 访问量 8708
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 黑客帝国 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览