题目
题目1523:从上往下打印二叉树
分析
可以用类似广度优先搜索的方法
不同的是这里用vector保存遍历到的节点编号
在搜索到某个节点后,将该节点的子节点push_back到vector
代码
#include <iostream>
#include <vector>
#include <string>
struct Node{
int value;
int lid;
int rid;
};
std::vector<Node> vn;
std::vector<int> v; //保存访问的节点编号
void Bsearch(){
v.push_back(1);
std::vector<int>::size_type vid = 0;;
while(vid!=v.size()){
int nodeId = v.at(vid)-1;//得到节点编号-1
std::cout<<vn.at(nodeId).value;
if(vn.at(nodeId).lid){
v.push_back(vn.at(nodeId).lid);
}
if(vn.at(nodeId).rid){
v.push_back(vn.at(nodeId).rid);
}
if(vid<v.size()-1)
std::cout<<" ";
else
std::cout<<std::endl;
vid++;
}
}
void judo(int n){
if(n==0){
std::cout<<"NULL"<<std::endl;
return;
}
Node nd;
nd.lid = 0;
nd.rid = 0;
for(int i = 0;i<n;i++){
std::cin>>nd.value;
vn.push_back(nd);
}
std::string ci;
for(int i = 0;i<n;i++){
std::cin>>ci;
switch (ci[0]){
case 'd':
std::cin>>vn.at(i).lid>>vn.at(i).rid;
break;
case 'r':
std::cin>>vn.at(i).rid;
break;
case 'l':
std::cin>>vn.at(i).lid;
break;
case 'z':
break;
}
}
Bsearch();
}
int main() {
int n;
while(std::cin>>n){
judo(n);
}
return 0;
}