二叉树的三种递归方法
今天学习了二叉树的知识学习了三种遍历二叉树的方法,虽然不知道后面两种有什么卵用,但还是讲解一下:
第一种:先序遍历
1、先访问其节点本身;
2、访问其左边的子节点;
3、再访问其右边的子节点。
这种遍历二叉树的方法其实就是深搜,先访问左边一整条线的节点,就相当于搜索迷宫时朝一个方向一直走,直到不能走时再换一个方向,或者回溯一步
第二种:中序遍历
1、先访问其左边的子节点;
2、再访问其节点本身;
3、最后访问其右边的子节点。
不知道怎么用诶 %>_<%
第三种:后序遍历
1、先访问其左边的子节点;
2、再访问其右边的子节点。
3、最后访问其节点本身;
这个应该是相当于走迷宫时,找到了出口,再沿着路顺藤摸瓜………… 应该是吧………… 如果我错了,请大神在评论里纠正哦 O(∩_∩)O谢谢
接下来看两道例题
一、
二叉树的建立与遍历
题目描述
给出一棵二叉树,分别输出先序、中序、后序遍历结果。
输入
第1行:结点数n(1<=n<=100)
以下若干行,每行3个整数,分别表示父结点、左孩子、右孩子。若没有孩子,对应的整数为0.
输出
第1行:树根
第2行:先序遍历结果,数字间用1个空格分开。
第3行:中序遍历结果,数字间用1个空格分开。
第4行:后序遍历结果,数字间用1个空格分开。
样例输入
8
1 2 4
2 0 0
4 8 0
3 1 5
5 6 0
6 0 7
8 0 0
7 0 0
样例输出
3
3 1 2 4 8 5 6 7
2 1 8 4 3 6 7 5
2 8 4 1 7 6 5 3
这道题是在考验我们的基本功,用三种递归方式来遍历整个二叉树
如果实在不知道怎么做的话,代码如下,希望能够有人提出更好的建议: ~\(≧▽≦)/~
<span style="BACKGROUND-COLOR: #ffff99"><span style="BACKGROUND-COLOR: #ffcccc">#include<algorithm>
#include<cstdio>
using namespace std;
struct ill{
int fa,lch,rch;
}tr[101];
int n,flag;
void ff(int i)
{
if(i)
{
if(!flag)
flag=1;
else
printf(" ");
printf("%d",i);
ff(tr[i].lch);
ff(tr[i].rch);
}
}
void mf(int i)
{
if(i)
{
mf(tr[i].lch);
if(!flag)
flag=1;
else
printf(" ");
printf("%d",i);
mf(tr[i].rch);
}
}
void bf(int i)
{
if(i)
{
bf(tr[i].lch);
bf(tr[i].rch);
if(!flag)
flag=1;
else
printf(" ");
printf("%d",i);
}
}
int main()
{
int i,j,k,l;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&j,&k,&l);
tr[j].lch=k;tr[j].rch=l;
tr[k].fa=j;tr[l].fa=j;
}
flag=0;
for(i=1;i<=n;i++)
{
if(!tr[i].fa)
{
printf("%d\n",i);
ff(i);
printf("\n");
flag=0;
mf(i);
printf("\n");
flag=0;
bf(i);
printf("\n");
}
}
}</span></span>
二、
根据两种遍历顺序确定树结构(build-tree)
题目描述
输入
第1行:二叉树的前序遍历顺序第2行:中序遍历顺序
输出
二叉树的后序遍历顺序
样例输入
Copy (如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)
ABCDEFGH
CBEDAGHF
样例输出
CEDBHGFA
这题坑了我足足一个小时的青春年华 ~~~~(>_<)~~~~
首先,要将这个树建立出来,可是在调试的时候,好多BUG…………
后来发现了其中大大的奥秘
比如样例输入:
ABCDEFGH(先序)
CBEDAGHF(中序)
首先,A肯定是树根,并且就第二行可以看出来,CBED肯定是A的左儿子延伸的,GHF肯定是A的右儿子延伸的,以此类推,树就建立好了 O(∩_∩)O~
做了很多调整后,AC了!!!!!!! ^_^
代码如下,请教改进的建议:~\(≧▽≦)/~
<span style="BACKGROUND-COLOR: #ffff99">#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
struct ill{
char fa,lch,rch;
}tr[251];
int n,ll;char ff[255]={0},mf[255]={0};
int ffv[255]={0};
void build(int l,int r,int s,int f)
{
int i,j;
for(j=s+1;;j++)
{
if(!ffv[j])
{
for(i=l;i<=r;i++)
{
if(ff[j]==mf[i])
{
if(!tr[mf[f]].lch)
{
tr[mf[f]].lch=ff[j];
tr[ff[j]].fa=mf[f];
ffv[j]=1;
build(l,i-1,j,i);
build(i+1,r,j,i);
}
else
{
tr[mf[f]].rch=ff[j];
tr[ff[j]].fa=mf[f];
ffv[j]=1;
build(l,i-1,j,i);
build(i+1,r,j,i);
}
}
}
break;
}
}
}
void work(char i)
{
if(i)
{
work(tr[i].lch);
work(tr[i].rch);
printf("%c",i);
}
}
int main()
{
int i;
scanf("%s%s",ff,mf);
ll=strlen(ff);
for(i=0;i<ll;i++)
{
if(ff[0]==mf[i])
{
build(0,i-1,0,i);
build(i+1,ll-1,i,i);
break;
}
}
work(ff[0]);
}</span>