pat 1102
PAT
2023-09-14 09:13:21 时间
1.源代码
#include<cstdio>
#include<queue>
#define maxn 100
using namespace std;
struct Node{
int left,right;
int root_flag = 1 ;//根标志
};
int num;//结点总数
Node node[maxn];//二叉树节点
vector<int> 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<int> 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.本题其实不用真实的旋转,对于该树直接层次遍历,中序遍历,最后倒着输出即可。
*/
相关文章
- 1017 A除以B (20 分)—PAT (Basic Level) Practice (中文)
- 1061 判断题 (15 分)—PAT (Basic Level) Practice (中文)
- 1022 D进制的A+B (20 分)—PAT (Basic Level) Practice (中文)
- 3-08. 栈模拟队列(25)(ZJU_PAT 模拟)
- PAT 1101 Quick Sort[一般上]
- PAT 1018 Public Bike Management[难]
- PAT Maximum Subsequence Sum[最大子序列和,简单dp]
- PAT 1003 Emergency[图论]
- pat 1048
- pat 1040