zoukankan      html  css  js  c++  java
  • 二叉树的三种递归方法

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

     

    第一种:先序遍历

        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
    ",i);
    			ff(i);
    			printf("
    ");
    			flag=0;
    			mf(i);
    			printf("
    ");
    			flag=0;
    			bf(i);
    			printf("
    ");
    		}
    	}
    }</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>

  • 相关阅读:
    SSH框架——(二)四层结构:DAO,Service,Controller,View层
    Spring知识概括梳理
    设计模式——(一)工厂模式2
    设计模式——(一)工厂模式1
    Spring——(一)IoC
    Toad 实现 SQL 优化
    string 和String的区别
    StructureMap依赖注入
    Oracle/PLSQL: BitAnd Function
    log.debug(e.getMessage());
  • 原文地址:https://www.cnblogs.com/Darknesses/p/12002573.html
Copyright © 2011-2022 走看看