• 1020 Tree Traversals


    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 (≤), 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

    题意:

      给出一棵二叉树后序遍历和中序遍历的结果,要求输出这颗二叉树层序遍历的结果。

    思路:

      首先我们可以根据中序遍历和后序遍历的规律来建立这颗二叉树,然后再层序遍历就好了。后序遍历序列的最后一个数字是根节点,然后通过中序遍历中根节点的位置我们可以计算出根节点左子树和右子树中节点的个数,进而将后序遍历的序列划分为两部分,然后进行递归就好了。

    Code:

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 typedef struct Node* node;
     6 
     7 struct Node {
     8     int val;
     9     node left;
    10     node right;
    11     Node(int v) {
    12         val = v;
    13         left = NULL;
    14         right = NULL;
    15     }
    16 };
    17 
    18 vector<int> postOrder;
    19 vector<int> inOrder;
    20 
    21 int n;
    22 
    23 void LevelOrderTravel(node root) {
    24     queue<node> que;
    25     que.push(root);
    26     bool isFirst = true;
    27     while (!que.empty()) {
    28         if (isFirst) {
    29             isFirst = false;
    30             cout << que.front()->val;
    31         } else {
    32             cout << " " << que.front()->val;
    33         }
    34         if (que.front()->left) que.push(que.front()->left);
    35         if (que.front()->right) que.push(que.front()->right);
    36         que.pop();
    37     }
    38 }
    39 
    40 node buildTree(int l1, int r1, int l2, int r2) {
    41     if (l1 > r1 || l2 > r2) return NULL;
    42     int val = postOrder[r1];
    43     node root = new Node(val);
    44     int pos = 0;
    45     for (int i = l2; i <= r2; ++i) {
    46         if (inOrder[i] == val) {
    47             pos = i;
    48             break;
    49         }
    50     }
    51     int rightLen = r2 - pos;
    52     int leftLen = pos - l2;
    53     root->right = buildTree(r1 - rightLen, r1 - 1, pos + 1, r2);
    54     root->left = buildTree(l1, l1 + leftLen - 1, l2, l2 + leftLen - 1);
    55     return root;
    56 }
    57 
    58 int main() {
    59     cin >> n;
    60     postOrder.resize(n + 1, 0);
    61     inOrder.resize(n + 1, 0);
    62     for (int i = 0; i < n; ++i) cin >> postOrder[i];
    63     for (int i = 0; i < n; ++i) cin >> inOrder[i];
    64     node root = buildTree(0, n - 1, 0, n - 1);
    65     LevelOrderTravel(root);
    66     return 0;
    67 }
  • 相关阅读:
    C#添加修改删除文件文件夹大全
    实用且不花哨的js代码大全
    vs2005 2008快捷键
    C#:String.Format数字格式化输出
    获取农历日期
    Vim 常用快捷键
    一个简单的makefile示例及其注释
    nginx源码剖析(1)概要
    利用Vim 打造开发环境(一)>Linux 字符界面 vim的配置
    Ubuntu 9.10设置摘要
  • 原文地址:https://www.cnblogs.com/h-hkai/p/13177801.html
Copyright © 2020-2023  润新知