L2-006. 树的遍历

参考自:http://blog.csdn.net/u013615904/article/details/51424123

 

 

 

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cstdio>
const int maxn = 3005;
int tree[maxn];

using namespace std;
void build(int treeLocation, vector<int>a, vector<int>b)
{
if(a.size()==0)
return;
int p;
for(int i=0; i<b.size(); i++)
if(b[i]==a[a.size()-1])
{
p = i;  //拿到根节点的坐标
break;
}
vector<int> aL, aR, bL, bR;
for(int i=0; i<p; i++)
aL.push_back(a[i]);
for(int i=p; i<a.size()-1; i++)
aR.push_back(a[i]);
for(int i=0; i<p; i++)
bL.push_back(b[i]);
for(int i=p+1; i<b.size(); i++)
bR.push_back(b[i]);   //以上四个for均为切割树,将树切割成左右两颗子树
tree[treeLocation] = b[p];  //根节点放进使用数组模拟的二叉树中
build(treeLocation<<1, aL, bL);  //这里有移位运算,左移一位,即*2
build(treeLocation<<1|1, aR, bR); //左移一位并且与1进行或运算,结果相当于+1;
}

void BFS()  //广度优先遍历
{


if(tree[1]==-1)
return;
queue<int> que;
int root = 1;
cout << tree[root];
if(tree[root<<1]!=-1) que.push(root<<1);
if(tree[root<<1|1]!=-1) que.push(root<<1|1);
while(que.size())
{
root = que.front();
cout << " " << tree[root];
que.pop();
if(tree[root<<1]!=-1) que.push(root<<1);
if(tree[root<<1|1]!=-1) que.push(root<<1|1);//使用队列进行广度优先遍历
}

}
int main()
{
int n;
cin >> n;
vector<int> postTRaversal;
vector<int> inorderTraversal;
int temp;
memset(tree, -1, sizeof(tree));
for(int i=0; i<n; i++)
{
cin >> temp;
postTRaversal.push_back(temp);
}
for(int i=0; i<n; i++)
{
cin >> temp;
inorderTraversal.push_back(temp);
}
build(1, postTRaversal, inorderTraversal);
BFS();
return 0;

}

转载于:https://www.cnblogs.com/1915884031A-qqcom/p/7375392.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值