pat 1102(patients)
1.源代码
#include
#include
#define maxn 100
using namespace std;
struct Node{
int left,right;
int root_flag = 1 ;//根标志
};
int num;//结点总数
Node node[maxn];//二叉树节点
vector result;//存储遍历结果
//从字符转换成数字
int charToNum(char a,int i){
if(a == '-'){
return -1;//没有孩子结点
}
else{
node[a-'0'].root_flag = 0;
return a-'0';
}
}
//找到根节点
int findRoot(){
for(int i = 0;i < num;i++){
if(node[i].root_flag != 0){
return i;
}
}
}
//层次遍历 -->从根开始
void level(int root){
int left,right;
int count = 0;
queue qu;//新建队列
qu.push(root);
while(!qu.empty()){//队列非空
if(count!=num-1) printf("%d ",qu.front());//输出队首
else printf("%d",qu.front());
count++;
right = node[qu.front()].right;
left = node[qu.front()].left;
if(right!=-1) qu.push(right);
if(left!=-1) qu.push(left);
qu.pop();//出队
}
printf("\n");
}
//中序遍历
void inOrder(int root){
if(node[root].left!=-1) inOrder(node[root].left);
result.push_back(root);//保存到result中
if(node[root].right!=-1) inOrder(node[root].right);
}
int main(){
scanf("%d",&num);//总结点数
getchar();
int i ;
char a,b;
for(i = 0;i< num;i++){//输入数据
scanf("%c %c",&a,&b);
getchar();
node[i].left = charToNum(a,i);
node[i].right = charToNum(b,i);
}
int root = findRoot();
level(root);
inOrder(root);
for(i = result.size()-1;i >=0 ;i--){
if(i!=0) printf("%d ",result[i]);
else printf("%d",result[i]);
}
}
/*
8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6
2
注:
1.要学会从输入数据时就开始处理数据。比如本题找根节点
2.本题其实不用真实的旋转,对于该树直接层次遍历,中序遍历,最后倒着输出即可。
*/
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~