P1305 新二叉树
题目描述
输入一串二叉树,输出其前序遍历。
输入格式
第一行为二叉树的节点数 n。(1≤n≤26)
后面 n 行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。
空节点用 * 表示
输出格式
二叉树的前序遍历。
输入输出样例
输入 #1
6
abc
bdi
cj*
d**
i**
j**
输出 #1
abdicj
#include<stdio.h>
#include<string.h>
int n;
char str[30][5];
void dfs(char word)
{
if(word!='*')//判断是否为空
{
printf("%c",word);//不是则输出
for(int i=0;i<n;i++)
if(str[i][0]==word)
{
dfs(str[i][1]);//先加左子树
dfs(str[i][2]);//再加右子树
}
}
else
return ;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",str[i]);
dfs(str[0][0]);
}
比昨天那道简单了一点点,还是用递归,但是要判断是否为空,为空则不输出。前序遍历是根结点左子树右子树,所以还是先加左边再加右边。
P1030 [NOIP2001 普及组] 求先序排列
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 \le 8≤8)。
输入格式
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
共一行一个字符串,表示一棵二叉树的先序。
输入输出样例
输入 #1
BADC
BDCA
输出 #1
ABCD
#include<stdio.h>
#include<string.h>
char mid[30],fro[30],aft[30];
int len,n;
void dfs(int l,int r,int l1)
{
if (l>r)
return ;
else
{
fro[n++]=aft[l1];
for (int i=l;i<=r;i++)//寻找根节点
if (mid[i]==aft[l1])
{
dfs(l,i-1,l1-r+i-1);//先累加左子树
dfs(i+1,r,l1-1);//后累加右子树
break;
}
}
}
int main()
{
scanf("%s %s",mid,aft);
len=strlen(mid);
dfs(0,len-1,len-1);
printf("%s",fro);
}
昨天那道同类型的题目,还是用递归,但是有很多不同的地方,纠结了一下午。先序是根结点左子树右子树,相当于是从上到下的遍历,所以fro[n++]应该放在递归开始前就记录。而且判断的临界条件不是l=r,不然右子树会多出一位,可以直接判断l>r就停止。
P4913 【深基16.例3】二叉树深度
题目描述
有一个 n(n≤10^6) 个结点的二叉树。给出每个结点的两个子结点编号(均不超过 n),建立一棵二叉树(根节点的编号为 1),如果是叶子结点,则输入 0 。
建好这棵二叉树之后,请求出它的深度。二叉树的深度是指从根节点到叶子结点时,最多经过了几层。
输入格式
第一行一个整数 n,表示结点数。
之后 n 行,第 i行两个整数 l、r,分别表示结点 i 的左右子结点编号。若 l=0 则表示无左子结点,r=0同理。
输出格式
一个整数,表示最大结点深度。
输入输出样例
输入 #1
7
2 7
3 6
4 5
0 0
0 0
0 0
0 0
输出 #1
4
#include<stdio.h>
struct node
{
int left;
int right;
}tree[1000005];
int n,step;
int max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
void dfs(int x,int y)//x表示结点,y表示深度
{
if(x==0)
return ;
step=max(step,y);//更新最大深度
dfs(tree[x].left,y+1);//先找左结点
dfs(tree[x].right,y+1);//再找右结点
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d %d",&tree[i].left,&tree[i].right);
dfs(1,1);
printf("%d",step);
}
简单粗暴认为只需要把不是叶子点的结点总数求出来就可以了,不出所料果然错了。因为不太会用bfs,所以用了dfs求解,所以需要不断更新最大深度。