Acm7-树的遍历和图

Acm 12:

重点:树的遍历补充,图

<1>二叉树的遍历

1).字符类型

   已知先序遍历和中序遍历:求后序遍历

思路:已知先序和中序,作用:先序找根结点;中序确定左右子树;

利用递归,依次让根结点、左子树函数、右子树函数入栈;

即:用递归分别确定左右子树的起始位置、终止位置,首先是找到左子树的部分再通过递归回去,在递归回去的同时输出左子树的所有值,递归回去找到最初根的位置;然后执行右子树函数,找到后,递归回去,输出右子树的所有值,最后输出根的值;

程序如下:
#include<stdio.h>
#include<string.h>
char a[100],b[100];
void f(int aa,int ae,int ba,int be )//左子树的起始位置,左子树的终止位置,右子树的起始位置,右子树的终止位置
{
    int i;
    if(aa>ae)//为了跳出循环,回到父节点,再对右子树进行查找
        return ;
    for(i=0;a[aa]!=a[i];++i);
f(aa+1,ae-be+i,ba,i-1);//左子树的遍历
    f(ae-be+i+1,ae,i+1,be);//右子树的遍历
    putchar(a[aa]);
}
int main()
{
   while(scanf("%s%s",a,b)!=EOF)
   {
       int len=strlen(a);
       f(0,len-1,0,len-1);
       printf("\n");
   }
    return 0;
}


注意点:

a.       同时输入两个字符串,可以这样表示scanf("%s%s",a,b)!=EOF

b.        左右子树坐标的关系:f(aa+1,ae-be+i,ba,i-1);其中i-1表示在中序遍历中不包含此时结点的左子树的个数的范围

f(ae-be+i+1,ae,i+1,be);//ae-be+i+1表示在先序遍历中的右子树的起始位置,i+1表示中序遍历中的右子树起始位置,be指中序遍历中的右子树终止位置;

 已知后序遍历和中序遍历:求先序遍历

#include<stdio.h>
#include <cstring>
int a[1005],b[1005];
int n,count;
void fun(int ab, int ae, int bb, int be)
{   int i;
   if(ab>ae)
       return ;
   for(i=bb; b[i]!=a[ae]; ++i);
  if(count<n)
       printf("%d ",a[ae]);
   else
   printf("%d",a[ae]);
   fun(ab,ae-be+i-1,bb,i-1);
   fun(ae-be+i,ae-1,i+1,be);
   count++;
}
int main()
{
 
   while(scanf("%d",&n) != EOF)
    {
       count=0;
        for(int i=0;i<n;i++)
           scanf("%d",&a[i]);
       for(int i=0;i<n;i++)
           scanf("%d",&b[i]);
       fun(0, n-1, 0, n-1);
       printf("\n");
    }
}


注意点:

1).不管我们是知先中还是知中后,它的本质是不会变的,从根结点出发,依然先找到左子树,通过递归回去找到根,通过根我们找到最初的右子树;换汤不换药,只是改变了输出根的位置;

2).题目要求在最后一个数没有空格,所以用count计数,没到最后一个时,printf(“%d ”,a[i]);%d后面有空格;当是最后一个时,printf(“%d”,a[i]);其后没有;

<2>图

1.组成要素:顶点和边;

2.特点:图可以没有边;

3.分类:有向图、无向图

 

一些名词:连通图(无向图),极大连通图(有向图),带权图(亦可称为网络),强连通图,权(边上的值),度,狐头狐尾;

4.特别解释:

路径长度:

1) 非带权图是边的和;

2) 带权图是边上的权的和;

3) 边数计算:完全无向图=n(n-1)/2;完全有向图=n(n-1);

4) 入度=出度=边数;

5) 度=入度+出度;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值