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) 度=入度+出度;