题意看的真尼马蛋疼,其实内容很简单,就是说有一颗二叉排序树,每次都把叶子去掉,直到最后连根节点也去掉,给出每次掉落的叶子,问你这棵树的先序遍历。
二叉排序树的概念很简单,就是对于树里的每个节点。它的左孩子总是比它小,它的右孩子总是比它大。这样子从根节点开始寻找某个节点时就非常简单,如果比根节点大就去右子树找,比根节点小就去左子树找。
知道了二叉排序树,那么这题的算法就很简单,最后掉落的是根节点,所以只需要自己创建一个二叉排序树,然后从根节点开始一个个扔进排序树,最后先序输出就可以了
#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
typedef struct Tree
{
char date; //所放字母
int v; //v表示这个节点有没有放入过字母
Tree *lchild;
Tree *rchild;
};
void insert(Tree *t,char c)
{
if(t->v==0) //如果这个点还未放入字母,则放入字母
{
t->lchild=new Tree; //创建两个没放入字母的左右孩子节点
t->rchild=new Tree;
t->lchild->v=0;
t->rchild->v=0;
t->date=c;
t->v=1;
}
else
{
if(c>t->date) //若 c比这个节点的字母要大,则插入右子树中,否则插入左子树
{
insert(t->rchild,c);
}
else insert(t->lchild,c);
}
}
void dfs(Tree *T)
{
if(T->v!=0) //按前序遍历,得到的就是按答案
{
printf("%c",T->date);
dfs(T->lchild);
dfs(T->rchild);
}
}
int main()
{
int i,j,k,len,flag;
char str[26][26];
Tree *root;
root=new Tree;
flag=1;
while(flag)
{
k=0;
root->v=0;//初始化根节点
while(1) //输入过程……有点蛋疼
{
gets(str[k++]);
if(str[k-1][0]=='*') break;
else if(str[k-1][0]=='$') {flag=0;break;}
}
for(i=k-2;i>=0;i--) //要倒着插入排序树,*和$不算的,所以i从k-2开始
{
len=strlen(str[i]);
for(j=0;j<len;j++)
insert(root,str[i][j]);
}
dfs(root); //遍历输出
cout<<endl;
}
return 0;
}