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