二叉树的三种递归方法

今天学习了二叉树的知识学习了三种遍历二叉树的方法,虽然不知道后面两种有什么卵用,但还是讲解一下:

 

第一种:先序遍历

    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>

posted @ 2016-10-02 10:13  Izayoi_Doyo  阅读(268)  评论(0编辑  收藏  举报