1102 Invert a Binary Tree (25 分)(二叉树遍历)
2024-09-04 09:22:06
二叉树有N个结点,给出每个结点的左右孩子结点的编号,把二叉树反转(左右孩子交换 所以是后序遍历交换) 输出反转后二叉树的层序遍历和中序遍历
#include<bits/stdc++.h> using namespace std;
const int N=;
struct node
{
int L,R;
}s[N];
int toint(char ch)
{
if(ch=='-'){
return -;
}
else{
return ch-'';
} }
int isroot[N];
void postorder(int root)
{
if(root==-){
return;
}
postorder(s[root].L);
postorder(s[root].R);
swap(s[root].L,s[root].R);
}
vector<int>in;
void print(int root)
{
if(root!=-){
print(s[root].L);
in.push_back(root);
print(s[root].R);
}
}
vector<int>le;
void lever(int root)
{
queue<int>Q;
Q.push(root);
while(!Q.empty()){
int u=Q.front();
Q.pop();
le.push_back(u);
if(s[u].L!=-) Q.push(s[u].L);
if(s[u].R!=-) Q.push(s[u].R); }
}
int main()
{
fill(isroot,isroot+N,false);
int n;
scanf("%d",&n);
for(int i=;i<n;i++){
char ch1,ch2;
scanf("%*c%c %c",&ch1,&ch2);
int a=toint(ch1);
int b=toint(ch2);
s[i].L=a;
s[i].R=b;
isroot[a]=true;
isroot[b]=true;
}
int root=;
for(int i=;i<n;i++){
if(isroot[i]==false){
root=i;
}
}
postorder(root);
print(root);
lever(root);
for(int i=;i<le.size();i++){
if(i) printf(" ");
printf("%d",le[i]);
}
printf("\n");
for(int i=;i<in.size();i++){
if(i) printf(" ");
printf("%d",in[i]);
}
printf("\n");
return ;
}
最新文章
- Atitit.数据检索与网络爬虫与数据采集的原理概论
- 多媒体(3):基于WindowsAPI的视频捕捉卡操作
- 思考探索,如何才能高效访问我的这个DataTable?
- java中的类实现comparable接口 用于排序
- ssl https双向验证的配置与证书库的生成
- richedit设置滚动条的位置和更新内容
- 2.12. 后端 SQL 的可见性(Core Data 应用程序实践指南)
- Node.js之包与npm包管理工具
- Button标签自动刷新问题
- ASP.NET 设计模式:设计模式和原则简述
- CTF---Web入门第十二题 程序逻辑问题
- Java二叉树实现及递归与非递归遍历实现
- SQL 基础学习(1):下载DB Browser for SQLite. 下载graphviz(为了使用Rails ERD的前提)出现❌,已debug.
- log4j日志日记记录使用教程
- ThreadLocal的练习代码
- 【MVC】View的使用
- js中var与let
- 报表导出jxls的使用笔记
- 深入理解JVM一垃圾回收算法
- 为什么我们选择parquet