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

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

#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]!='';j++){
                v=str[i][j]-'A';
                dfs(rootval,v);
            }
        }
        //前序遍历输出
        dlr_print(rootval);
        printf("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/chenxiwenruo/p/3349627.html