1102 Invert a Binary Tree (25分)
可以说是非常基础的一道题目了
题目大意:给一棵二叉树,要求输出反转二叉树(左右孩子交换位置)的层次遍历和中序遍历
考察点:
- 二叉树的输入,寻找根结点
- 层序遍历和中序遍历
#include<iostream> //输入输出流头文件
#include<queue> //队列
#include<string> //C++string类
using namespace std; //标准命名空间
struct invertTree{
int right;
int left;
};
invertTree t[10];
int flag[10]={0};
string s;
void createTree(int n);
void levelOrder(int r);
void inOrder(int r);
int main(){ //主函数
#ifdef ONLINE_JUDGE //如果有oj系统(在线判定),则忽略文件读入,否则使用文件作为标准输入
#else
freopen("1.txt", "r", stdin); //从1.txt输入数据
#endif
int n;
cin>>n;
createTree(n);
int i=0;
for(;i<n;i++) //找到根结点
if(flag[i]==0)break;
int root=i;
levelOrder(root);
cout<<endl;
inOrder(root);
cout<<s.substr(0,s.size()-1)<<endl;
return 0; //返回0,如果不返回0,PAT会报错
}
void createTree(int n){
for(int i=0;i<n;i++){
char x,y;
cin>>x>>y;
if(x!='-') {//把先输入的作为右孩子,后输入的作为左孩子。即完成反转
t[i].right=x-'0';
flag[t[i].right]=1;
}
else t[i].right=-1;
if(y!='-'){
t[i].left=y-'0';
flag[t[i].left]=1;
}
else t[i].left=-1;
}
}
void levelOrder(int r){
queue<int> q;
q.push(r);
while(!q.empty()){
int x=q.front();
if(t[x].left!=-1)
q.push(t[x].left);
if(t[x].right!=-1)q.push(t[x].right);
cout<<x;
q.pop();
if(!q.empty())cout<<' ';
}
}
void inOrder(int r){
if(r==-1) return ;
if(t[r].left!=-1)
inOrder(t[r].left);
s+='0'+r;
s+=" ";
if(t[r].right!=-1)
inOrder(t[r].right);
}