swust oj 1052

输出利用先序遍历创建的二叉树中的指定结点的双亲结点

1000(ms)
10000(kb)
2415 / 5575
利用先序递归遍历算法创建二叉树并输出该二叉树中指定结点的双亲结点。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符“#”时表示该结点不需要创建,否则创建该结点。最后再输出创建完成的二叉树中的指定结点的双亲结点。注意输入数据序列中的“#”字符和非“#”字符的序列及个数关系,这会最终决定创建的二叉树的形态。

输入

输入用例分2行输入,第一行接受键盘输入的由大写英文字符和“#”字符构成的一个字符串(用于创建对应的二叉树),第二行为指定的结点数据。

输出

用一行输出该用例对应的二叉树中指定结点的双亲结点。若相应双亲结点不存在则以“#”代替。

样例输入

A##
A
ABC####
B

样例输出

#
A 
  1 #include<iostream>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<cstdlib>
  5 #include<cstdio>
  6 typedef char Datetype;
  7 using namespace std;
  8 char x;
  9 
 10 typedef struct link{
 11     Datetype date;
 12     struct link *lchild;
 13     struct link *rchild;
 14 }tree;
 15 
 16 typedef struct queue{
 17     tree *data;
 18     struct queue *next;
 19 }que;
 20 
 21 typedef struct {
 22     que *front;
 23     que *rear;
 24 }lin;
 25 
 26 void Initqueue(lin *&L)
 27 {
 28     L=(lin *)malloc(sizeof(lin));
 29     L->front=L->rear=NULL;
 30 }
 31 
 32 void destroyed(lin *&L)
 33 {
 34     que *p=NULL,*r=NULL;
 35     p=L->front;
 36     while(p!=NULL)
 37     {
 38         r=p;
 39         p=p->next;
 40         free(r);
 41     }
 42     free(L);
 43 }
 44 
 45 bool pop(lin *&L, tree *&e)
 46 {
 47     que *p;
 48     if(L->rear==NULL)
 49         return false;
 50     p=L->front;
 51     if(L->rear==L->front)
 52         L->front=L->rear=NULL;
 53     else
 54         L->front=p->next;
 55     e=p->data;
 56     free(p);
 57     return true;
 58 }
 59 
 60 int empty(lin *&L)
 61 {
 62     return (L->rear==NULL);
 63 }
 64 
 65 void push(lin *&L,tree *e)
 66 {
 67     que *p;
 68     p = (que *)malloc(sizeof(que));
 69     p->data=e;
 70     p->next=NULL;
 71     if(L->rear==NULL)
 72     {
 73         L->front=p;
 74         L->rear=p;
 75     }
 76     else
 77     {
 78         L->rear->next=p;
 79         L->rear=p;
 80     }
 81 }
 82 
 83 void creattree(tree *&L)
 84 {
 85     char c;
 86     cin>>c;
 87     if(c=='#')
 88         L=NULL;
 89     else
 90     {
 91         L = (tree *)malloc(sizeof(tree)) ;
 92         L->date=c;
 93         creattree(L->lchild);
 94         creattree(L->rchild);
 95     }
 96 }
 97 
 98 void find(tree *L)
 99 {
100     if(L!=NULL)
101     {
102         x++;
103         find(L->rchild);
104     }
105 }
106 
107 void destroytree(tree *&L)
108 {
109     if(L!=NULL)
110     {
111         destroytree(L->lchild);
112         destroytree(L->rchild);
113         free(L);
114     }
115 }
116 
117 int deep(tree *L)
118 {
119     int ldep,rdep,max;
120     if(L!=NULL)
121     {
122         ldep=deep(L->lchild);
123         rdep=deep(L->rchild);
124         max=ldep>rdep?ldep+1:rdep+1;
125         return max;
126     }
127     else
128         return 0;
129 }
130 
131 void finddegree(tree *&L, int n)
132 {
133     if(L!=NULL)
134     {
135         if(x<n)
136             x=n;
137         finddegree(L->lchild,n);
138         finddegree(L->rchild,n+1);
139     }
140 
141 }
142 
143 void run(tree *L)
144 {
145     tree *p=L;
146     lin *qu;
147     Initqueue(qu);
148     if(L!=NULL)
149         push(qu,p);
150     while(!empty(qu))
151     {
152         pop(qu,p);
153         cout<<p->date;
154         if(p->lchild!=NULL)
155             push(qu,p->lchild);
156         if(p->rchild!=NULL)
157             push(qu,p->rchild);
158     }
159     destroyed(qu);
160 }
161 
162 void displayhou(tree *&L)
163 {
164     if(L!=NULL)
165     {
166         displayhou(L->lchild);
167         displayhou(L->rchild);
168         cout<<L->date;
169     }
170 }
171 
172 void displaypre(tree *&L)
173 {
174     if(L!=NULL)
175     {
176         cout<<L->date;
177         displaypre(L->lchild);
178         displaypre(L->rchild);
179     }
180 }
181 
182 void creatinpre(tree *&L ,char *in,char *pre,int x)
183 {
184     int k=0;
185     char *p;
186     if(x<=0)
187     {
188         L=NULL;
189         return ;
190     }
191     L=(tree *)malloc(sizeof(tree));
192     L->date = *pre;
193     for(p=in ; p<in+x; p++)
194     {
195         if(*p==*pre)
196             break;
197     }
198     k=p-in;
199     creatinpre(L->lchild,in,pre+1,k);
200     creatinpre(L->rchild,p+1,pre+k+1,x-k-1);
201 }
202 
203 void creatinhou(tree *&L ,char *in,char *pre,int x)
204 {
205     int k=0;
206     char *p;
207     if(x<=0)
208     {
209         L=NULL;
210         return ;
211     }
212     L=(tree *)malloc(sizeof(tree));
213     L->date = *pre;
214     for(p=in ; p>in-x; p--)
215     {
216         if(*p==*pre)
217             break;
218     }
219     k=in-p;
220     creatinhou(L->rchild,in,pre-1,k);
221     creatinhou(L->lchild,p-1,pre-k-1,x-k-1);
222 }
223 
224 void findson(tree *&L)
225 {
226     if(L!=NULL)
227     {
228         if(L->date==x)
229         {
230             if(L->lchild==NULL)
231                 cout<<"L:#";
232             else
233                 cout<<"L:"<<L->lchild->date;
234             if(L->rchild==NULL)
235                 cout<<",R:#";
236             else
237                 cout<<",R:"<<L->rchild->date;
238             return ;
239         }
240         findson(L->lchild);
241         findson(L->rchild);
242     }
243 }
244 
245 void finddad(tree *&L)
246 {
247     if(L!=NULL)
248     {
249         if(L->lchild!=NULL&&L->lchild->date==x||L->rchild!=NULL&&L->rchild->date==x)
250         {
251             cout<<L->date;
252             return ;
253         }
254 
255         finddad(L->lchild);
256         finddad(L->rchild);
257     }
258 }
259 
260 int main()
261 {
262     tree *L = NULL;
263     creattree(L);
264     cin>>x;
265     if(x==L->date)
266         cout<<"#";
267     else
268         finddad(L);
269     destroytree(L);
270     return 0;
271 }
原文地址:https://www.cnblogs.com/Iwpml-595/p/10713072.html