树的遍历
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
题解:
根据后序+中序建立二叉树
步骤
只要满足中序左节点在右节点的左边,重复:
- 根节点的值等于后序的最右节点的值
- 中序中找到根节点的位置,此时的根节点把树分为左右两部分
- 根据中序确定后序中的左子树和右子树两部分的点的个数
- 建立此根节点的左右子树
- 返回建好的根节点
否则返回NULL
#include <bits/stdc++.h>
using namespace std;
int in[35];
int pos[35];
int n;
typedef struct node
{
struct node *left;
struct node *right;
int data;
}Node;
/*
2 3 1 5 7 6 4 后
1 2 3 4 5 6 7 中
*/
Node *create(int inL,int inR,int posL,int posR)
{
if(inL>inR)
return NULL;
Node * root=new Node;
root->data=pos[posR];
int i;
for(i=0;i<n;i++)
{
if(in[i]==pos[posR])
break;
}
int num=i-inL;
root->left=create(inL,inL+num-1,posL,posL+num-1);
root->right=create(inL+num+1,inR,posL+num,posR-1);
return root;
}
int main(void)
{
cin>>n;
for(int i=0;i<n;i++)
cin>>pos[i];
for(int i=0;i<n;i++)
cin>>in[i];
Node * root=create(0,n-1,0,n-1);
//普通bfs
queue<Node*>q;
q.push(root);
cout<<root->data;
while(!q.empty())
{
Node *tp=q.front();
q.pop();
if(tp->left)
{
cout<<" "<<tp->left->data;
q.push(tp->left);
}
if(tp->right)
{
cout<<" "<<tp->right->data;
q.push(tp->right);
}
}
return 0;
}