学习目录
1.背英语4级词汇1小时。
2.刷题。
题目
1.P1229 遍历问题
题目描述
我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序遍历,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:
所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。
输入格式
输A数据共两行,第一行表示该二叉树的前序遍历结果s1,第二行表示该二叉树的后序遍历结果s2。
输出格式
输出可能的中序遍历序列的总数,结果不超过长整型数。
输入输出样例
输入 #1复制
abc cba
输出 #1复制
4
说明/提示
无提示
#include<stdio.h>
#include<string.h>
#include<math.h>
int sum,a;
char str1[10000],str2[10000];
int main()
{
gets(str1);
gets(str2);
for(int i=0;i<strlen(str1);i++)
{
for(int j=1;j<strlen(str2);j++)
{
if(str1[i]==str2[j]&&str1[i+1]==str2[j-1])
{
sum++;
}
}
}
a=pow(2,sum);
printf("%d",a);
return 0;
}
题解:对于只有一个儿子的节点,且为二叉树,则每有一层(除根节点外)有2种可能,则遍历数为 2的节点个数次方种可能性。
2.P4913 【深基16.例3】二叉树深度
题目描述
给出每个节点的两个儿子节点,建立一棵二叉树(根节点为 11),如果是叶子节点,则输入0 0
。建好树后希望知道这棵二叉树的深度。二叉树的深度是指从根节点到叶子结点时,最多经过了几层。
最多有 10^6106 个结点。
输入格式
无
输出格式
无
输入输出样例
输入 #1复制
7 2 7 3 6 4 5 0 0 0 0 0 0 0 0
输出 #1复制
4
#include<stdio.h>
int n,sum=1;
struct tree
{
int left,right,father;
}a[10000000];
void dfs(int x, int y)//节点,层数
{
if(x==0||y==0)//判定是否为叶子结点
return;
else
{
sum=sum>y?sum:y;//判断是否到达更大的层数
dfs(a[x].left,y+1);//向左遍历
dfs(a[x].right,y+1);//向右遍历
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].left,&a[i].right);
}
dfs(1,1);//从根节点开始
printf("%d",sum);
return 0;
}
3.P1030 [NOIP2001 普及组] 求先序排列
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度\le 8≤8)。
输入格式
22行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
11行,表示一棵二叉树的先序。
输入输出样例
输入 #1复制
BADC BDCA
输出 #1复制
ABCD
说明/提示
【题目来源】
NOIP 2001 普及组第三题
#include<stdio.h>
#include<string.h>
char zhon[10000],hou[10000];//中序和后序
void fun(int a,int b)//递归函数
{
int f,c=0;
if(a>b)//判断是否查找完毕
{
return;
}
for(int j=strlen(zhon)-1;j>=0;j--)//从后序的最后一个开始
{
for(int i=a;i<=b;i++)//从最左往最右找
{
if(zhon[i]==hou[j])//找到根的位置
{
c=i;
break;
}
}
if(c)//判断是否找到根的位置
{
break;
}
}
printf("%c",zhon[c]);//输出子树的根
fun(a,c-1);//左子树
fun(c+1,b);//右子树
}
int main()
{
scanf("%s%s",zhon,hou);
fun(0,strlen(zhon)-1);//调用函数
return 0;
}