L2-006 树的遍历 (25 分)

匿名 (未验证) 提交于 2019-12-02 23:26:52

L2-006 树的遍历 (25 分)

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例:

4 1 6 3 5 7 2

题解

递归建树

代码

#include <iostream> #include <vector> #include <queue> using namespace std; struct BinTree {     int val;     BinTree *left, *right; }; vector<int> post_order, in_order; int n; BinTree* BuildTree(BinTree *root, int l, int r, int pl, int pr) {     if(l > r || pl > pr)         return nullptr;     root = new BinTree;     root->val = post_order[pr];     root->left = root->right = nullptr;     int ri = -1;     for(int i=l;i<=r;i++)     {         if(in_order[i] == root->val)         {             ri = i;             break;         }     }     int mid = pl-1;     for(int i=l;i<ri;i++)     {         for(int j=pl;j<pr;j++)         {             if(in_order[i] == post_order[j])             {                 if(j > mid)                     mid = j;             }         }     }     root->left = BuildTree(root->left, l, ri-1, pl, mid);     root->right = BuildTree(root->right, ri+1, r, mid+1, pr-1);     return root; } void layer_order(BinTree *root) {     queue<BinTree*> q;     vector<int> ans;     if(root == nullptr)         return ;     q.push(root);     while(!q.empty())     {         BinTree *node = q.front();q.pop();         ans.push_back(node->val);         if(node->left)             q.push(node->left);         if(node->right)             q.push(node->right);     }     for(int i=0;i<ans.size();i++)     {         if(i!=0)             cout << " ";         cout << ans[i];     } } int main() {     cin >> n;     post_order.resize(n);     in_order.resize(n);     for(int i=0;i<n;i++)     {         cin >> post_order[i];     }     for(int i=0;i<n;i++)     {         cin >> in_order[i];     }     BinTree *root = nullptr;     root = BuildTree(root, 0, n-1, 0, n-1);     layer_order(root);     return 0; } 
文章来源: https://blog.csdn.net/weixin_43264529/article/details/88812180
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!