您的位置:首页 > 其它

POJ 1577 Falling Leaves (子母二叉树,给出叶子节点的删除序列,求前序遍历)

2013-10-02 20:23 399 查看
题意:给出一棵字母二叉树删除叶子节点的序列,按删除的顺序排列。让你输出该棵二叉树额前序遍历的序列。
思路:先把一棵树的所有删除的叶子节点序列存储下来,然后从最后一行字符串开始建树即可,最后遍历输出。
这里为方便起见,将子母转化成整数值存储。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
/*
AC
题意:给出一棵字母二叉树删除叶子节点的序列,按删除的顺序排列。让你输出该棵二叉树额前序遍历的序列。
思路:先把一棵树的所有删除的叶子节点序列存储下来,然后从最后一行字符串开始建树即可,最后遍历输出。
这里为方便起见,将子母转化成整数值存储。
*/
using namespace std;
const int maxn=30;
char str[30][30];

struct node{
int l,r; //左儿子的值、右儿子的值。若值为-1,表示不存在左/右儿子。
}node[maxn];

void dfs(int u,int v){
if(v<u){
//当u没有左儿子时,v赋值给u的左儿子,否则递归u的左儿子
if(node[u].l==-1){
node[u].l=v;
return;
}
else{
dfs(node[u].l,v);
}
}
else{
//当u没有右儿子时,v赋值给u的右儿子,否则递归u的右儿子
if(node[u].r==-1){
node[u].r=v;
return;
}
else{
dfs(node[u].r,v);
}
}
}
void dlr_print(int u){
if(node[u].l==-1&&node[u].r==-1){
printf("%c",u+'A');
return;
}
printf("%c",u+'A');
if(node[u].l!=-1)
dlr_print(node[u].l);
if(node[u].r!=-1)
dlr_print(node[u].r);
}
int main()
{
int m,u,v;
while(scanf("%s",str[0])!=EOF){
for(int i=0;i<maxn;i++){
node[i].l=node[i].r=-1;
}
m=1;
while(1){
scanf("%s",str[m]);
if(str[m][0]=='*' || str[m][0]=='$')
break;
m++;
}
int rootval=str[m-1][0]-'A';  //根节点的值。
for(int i=m-2;i>=0;i--){
for(int j=0;str[i][j]!='\0';j++){
v=str[i][j]-'A';
dfs(rootval,v);
}
}
//前序遍历输出
dlr_print(rootval);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐