二叉树的先序遍历,中序遍历,后序遍历分别对应着
先:根左右 || 中:左根右 || 后:左右根 的递归输出方式
先序中序后序非常形象的说明的是根和左,右的相对位置关系
我们可以用结构体储存一颗二叉树
如下:
struct node {
int left, right, num;
//left用于存左儿子的地址
//right用于存右儿子的地址
//num存当前地址p[root]对应的值
};
node p[110];
建好一颗树后,如何查询输出其实也很简单
如先序遍历:
void dfs1 (int root)
{
if (root == 0)
return ;
cout << p[root].num << " ";
dfs1 (p[root].left);
dfs1 (p[root].right);
}
中序遍历:
void dfs2 (int root)
{
if (root == 0)
return ;
dfs2 (p[root].left);
cout << p[root].num << " ";
dfs2 (p[root].right);
}
后序遍历:
void dfs3 (int root)
{
if (root == 0)
return ;
dfs3 (p[root].left);
dfs3 (p[root].right);
cout << p[root].num << " ";
}
可以看出输出程序的位置与左右儿子递归函数调用的相对位置和遍历顺序中根与左右的顺序一致
那么来一道例题
题目描述:
已知一棵二叉树,分别求它的先序编历,中序编历、后序编历(结点数N<=100)
输入格式:
第一行树结点个数,从第二行开始,每行三个数,第一个数是结点,第二个数是左孩子,第三个数是右孩子,0表示不存在左孩子或者右孩子
输出格式:
第一行先序编历,第二行中序编历,第三行后序编历,数与数之间有一个空格
样例输入:
5 1 2 3 2 4 5 3 0 0 4 0 0 5 0 0
样例输出:
1 2 4 5 3 4 2 5 1 3 4 5 2 3 1
是一道非常裸的模板题
就直接上AC代码了:
#include <iostream>
using namespace std;
struct node {
int left, right, num;
//left用于存左儿子的地址
//right用于存右儿子的地址
//num存当前地址p[root]对应的值
};
node p[110];
int n;
void dfs1 (int root)
{
if (root == 0)
return ;
cout << p[root].num << " ";
dfs1 (p[root].left);
dfs1 (p[root].right);
}
void dfs2 (int root)
{
if (root == 0)
return ;
dfs2 (p[root].left);
cout << p[root].num << " ";
dfs2 (p[root].right);
}
void dfs3 (int root)
{
if (root == 0)
return ;
dfs3 (p[root].left);
dfs3 (p[root].right);
cout << p[root].num << " ";
}
int main ()
{
cin >> n;
for (int i = 1; i <= n; ++i)
{
p[i].num = i;
int a, b, c;
cin >> a >> b >> c;
p[a].left = b;
p[a].right = c;
}
dfs1 (1);
cout << endl;
dfs2 (1);
cout << endl;
dfs3 (1);
}