Description:
Figure 1
- It may be empty.
- It may have a root node. A node has a letter as data and refers to a left and a right subtree. The left and right subtrees are also binary trees of letters.
- Empty trees are omitted completely.
- Each node is indicated by
- Its letter data,
- A line segment down to the left to the left subtree, if the left subtree is nonempty,
- A line segment down to the right to the right subtree, if the right subtree is nonempty.
- If the tree is empty, then the preorder traversal is empty.
- If the tree is not empty, then the preorder traversal consists of the following, in order
- The data from the root node,
- The preorder traversal of the root's left subtree,
- The preorder traversal of the root's right subtree.
输入说明
The input will contain one or more data sets. Each data set is a sequence of one or more lines of capital letters. The lines contain the leaves removed from a binary search tree in the stages described above. The letters on a line will be listed in increasing alphabetical order. Data sets are separated by a line containing only an asterisk ('*'). The last data set is followed by a line containing only a dollar sign ('$'). There are no blanks or empty lines in the input.
输出说明
For each input data set, there is a unique binary search tree that would produce the sequence of leaves. The output is a line containing only the preorder traversal of that tree, with no blanks.
输入样例
BDHPY CM GQ K * AC B $
输出样例
KGCBDHQMPY BAC
题解:
二叉树的插入和读取,右对齐的,就是在找的时候比大小,比他大的就排在右边,直到右边有空位,比他小的就排在左边,直到左边有空位。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> #include<iostream> #include<math.h> #include<queue> #include<stack> #include<vector> using namespace std; char sh[1000][1000]; int c; typedef struct ER { char bit; int l,r,p; }ER; ER er[10010]; void pai(int a,char b) { int i,j,k,l,m,t,n; if(b>er[a].bit) { if(er[a].r==0) { er[a].r=++c; er[c].bit=b; } else pai(er[a].r,b); } else { if(er[a].l==0) { er[a].l=++c; er[c].bit=b; } else pai(er[a].l,b); } } void pri(int i) { printf("%c",er[i].bit); if(er[i].l!=0) pri(er[i].l); if(er[i].r!=0) pri(er[i].r); } void qing() { int i,j; for(i=0;i<1000;i++) sh[i][0]='\0'; } int main() { ER root,temp,nel,ner; int i,j,k,l,m,n,leni,ye,len; char a,b,c,d; while(1) { memset(er,0,sizeof(er)); for(i=0;sh[i-1][0]!='*'&&sh[i-1][0]!='$';i++) scanf("%s",&sh[i]); leni=i-2; er[0].bit=sh[leni][0]; c=0; for(i=leni-1;i>=0;i--) for(j=0;j<(len=strlen(sh[i]));j++) { pai(0,sh[i][j]); } pri(0); printf("\n"); if(sh[leni+1][0]=='$') break; } return 0; }