后序、中序得前序、层序
程序员文章站
2022-05-19 20:58:41
...
后序、中序得前序、层序
输入
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出
4 1 6 3 5 7 2
两种方法:
1.第一种编程较为复杂,但是思路清晰,而且通用。
建树+BFS
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=50;
struct node{
int data;
node* lchild;
node* rchild;
};
int pre[maxn],in[maxn],post[maxn];
int n;
node* create(int postL,int postR,int inL,int inR )
{
if(postL>postR || inL>inR)
{
return NULL;
}
node* root = new node;
root->data=post[postR];
int k=-1;
for(int i=inL;i<=inR;i++)
{
if(in[i]==post[postR])
{
k=i;
break;
}
}
int num_left=k-inL;
root->lchild=create(postL,postL+num_left-1,inL,k-1);
root->rchild=create(postL+num_left,postR-1,k+1,inR);
return root;
}
void BFS(node* root)
{
int num=0;
queue<node* > q;
q.push(root);
while(!q.empty())
{
node* now=q.front();
q.pop();
printf("%d",now->data);
num++;
if(num<n)
{
printf(" ");
}
if(now->lchild!=NULL)
{
q.push(now->lchild);
}
if(now->rchild!=NULL)
{
q.push(now->rchild);
}
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&post[i]);
}
for(int i=0;i<n;i++)
{
scanf("%d",&in[i]);
}
node* root=create(0,n-1,0,n-1);
BFS(root);
return 0;
}
2.第二种,直接输出不建树
1>.中序+后序-》前序
/*因为后序的最后一个总是根结点,令i在中序中
//找到该根结点,则i把中序分为两部分,左边为
//左子树,右边为右子树。因为是输出先序(根左右),
//所以先打印出当前根结点,然后打印左子树,
//再打印右子树。左子树在后序中的根结点为
//root-(end-i+1),就是当前根结点-右子树的个数。
//左子树在中序中的起始点start为start,末尾end点
//为i-1,右子树的根结点为当前根结点的前一个结点
//root-1,右子树的起始点start为i+1,末尾end点为end。
*/
#include <cstdio>
#include <algorithm>
using namespace std;
int post[]={3,4,2,6,5,1};
int in[]={3,2,4,1,6,5};
void pre(int root,int start,int end)
{
if( start>end )
{
return;
}
int i=start;
while(i<end && in[i]!=post[root])
{
i++;
}
printf("%d ",post[root]);
pre(root-1-end+i,start,i-1);
pre(root-1,i+1,end);
}
int main()
{
pre(5,0,5);
return 0;
}
2>.中序+后序-》层序
/*与后序中序转换为前序的代码相仿(无须构造二叉树
//再进行广度优先 搜索)
//多加一个变量index,表示当前的根结点在二叉搜索树
//中对应的下标(从0开始),所以进行一次输出先序的
//递归的时候,就可以把根结点下标所对应的值存储在
//level数组中(开始把level都置为-1,表示此处没有
//结点),这样在递归完成后level数组中非-1的数就是
//按照下标排列的层序遍历的顺序
//
//
//
*/
#include <cstdio>
#include <vector>
using namespace std;
vector<int> post,in,level(100000,-1);
void pre(int root,int start,int end,int index)
{
if(start>end)
{
return;
}
int i=start;
while(i<end && in[i]!=post[root])
{
i++;
}
level[index]=post[root];
pre(root-1-end+i,start,i-1,2*index+1);
pre(root-1,i+1,end,2*index+2);
}
int main()
{
int n,cnt=0;
scanf("%d",&n);
post.resize(n);
in.resize(n);
for(int i=0;i<n;i++)
{
scanf("%d",&post[i]);
}
for(int i=0;i<n;i++)
{
scanf("%d",&in[i]);
}
pre(n-1,0,n-1,0);
for(int i=0;i<level.size();i++)
{
if(level[i]!=-1&& cnt!=n-1)
{
printf("%d ",level[i]);
cnt++;
}
else if( level[i]!=-1)
{
printf("%d",level[i]);
break;
}
}
return 0;
}
上一篇: L - Tree HDU - 6228
下一篇: hdu6228 Tree (图论思维题)
推荐阅读
-
Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】
-
Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】
-
Python实现二叉树前序、中序、后序及层次遍历示例代码
-
Python利用前序和中序遍历结果重建二叉树的方法
-
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
-
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
-
[PHP] 算法-根据前序和中序遍历结果重建二叉树的PHP实现
-
c/c++ 用前序和中序,或者中序和后序,创建二叉树
-
Python实现二叉树前序、中序、后序及层次遍历示例代码
-
【算法】二叉树的前序、中序、后序、层序遍历和还原。