原题目:MFOJ P1339-二叉树遍历
题目:
描述
给你一棵 n(1≤n≤10) 个结点的二叉树,请你输出它的先序遍历、中序遍历、后序遍历
格式
输入
第一行一个正整数 n,表示二叉树的结点个数,编号为 1∼n。
第二行开始,连续 n 行,每行三个正整数 u,l,r,表示 u 的左儿子 l 和右儿子 r,若没有儿子,则相应的位置为 0。
输出
输出 3 行,每行 n 个正整数,分别表示该二叉树的先序遍历、中序遍历、后序遍历,中间用一个空格隔开。
示例
输入数据1
6
1 5 6
5 2 3
2 0 0
3 4 0
6 0 0
4 0 0
输出数据1
1 5 2 3 4 6
2 5 4 3 1 6
2 4 3 5 6 1
思路:
(本文主要是探讨代码实现,就不再放先中后三种遍历的图示和讲解了,CSDN上有许多大佬做过这种内容,各位可以去搜索阅读)
这题的模板性挺强的
不过要我们干什么都已经写的不能再清楚了,那就...
上!代!码!
先序遍历:中→左→右
void fs(int &rt){
if(rt!=0){
cout<<nd[rt].v<<" ";//中(父节点)
fs(nd[rt].lchild);//左儿子
fs(nd[rt].rchild);//右儿子
}
}
中序遍历:左→中→右
void md(int &rt){
if(rt!=0){
md(nd[rt].lchild);//左儿子
cout<<nd[rt].v<<" ";//中(父节点)
md(nd[rt].rchild);//右儿子
}
}
后序遍历:左→右→中
void bk(int &rt){
if(rt!=0){
bk(nd[rt].lchild);//左儿子
bk(nd[rt].rchild);//右儿子
cout<<nd[rt].v<<" ";//中(父节点)
}
}
那么,把它们都加到代码里就行了!
#include<bits/stdc++.h>
using namespace std;
const int N=17;
struct node{
int v;//节点的值
int lchild,rchild;//左、右儿子
}nd[N];//定义节点
void fs(int &rt){//先序遍历
if(rt!=0){
cout<<nd[rt].v<<" ";
fs(nd[rt].lchild);
fs(nd[rt].rchild);
}
}
void md(int &rt){//中序遍历
if(rt!=0){
md(nd[rt].lchild);
cout<<nd[rt].v<<" ";
md(nd[rt].rchild);
}
}
void bk(int &rt){//后序遍历
if(rt!=0){
bk(nd[rt].lchild);
bk(nd[rt].rchild);
cout<<nd[rt].v<<" ";
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);//加速输入输出
int n;
int root=1;//在调用遍历函数时需要引用
cin>>n;
for(int i=1,u,l,r;i<=n;i++){
cin>>u>>l>>r;
nd[u].v=u;//记录节点值(这里以节点值作为数组下标,是为了方便在遍历时进行查找)
nd[u].lchild=l;//记录节点左儿子
nd[u].rchild=r;//记录节点右儿子
}
fs(root);
cout<<"\n";
md(root);
cout<<"\n";
bk(root);
return 0;
}
本人第一次写博客,可能有些纰漏,还请各位大佬多多批评指点!