@@ -171,6 +171,84 @@ <h1 class="header-author js-header-author">bfx</h1>
171
171
< div id ="js-content " class ="content-ll ">
172
172
173
173
174
+ < article id ="post-1119 Pre- and Post-order Traversals (30分) " class ="article article-type-post article-index " itemscope itemprop ="blogPost ">
175
+ < div class ="article-inner ">
176
+
177
+ < header class ="article-header ">
178
+
179
+
180
+ < h1 itemprop ="name ">
181
+ < a class ="article-title " href ="/2020/03/05/1119%20Pre-%20and%20Post-order%20Traversals%20(30%E5%88%86)/ "> 1119 Pre- and Post-order Traversals (30分)</ a >
182
+ </ h1 >
183
+
184
+
185
+
186
+ < a href ="/2020/03/05/1119%20Pre-%20and%20Post-order%20Traversals%20(30%E5%88%86)/ " class ="archive-article-date ">
187
+ < time datetime ="2020-03-05T14:17:04.357Z " itemprop ="datePublished "> < i class ="icon-calendar icon "> </ i > 2020-03-05</ time >
188
+ </ a >
189
+
190
+ </ header >
191
+
192
+ < div class ="article-entry " itemprop ="articleBody ">
193
+
194
+ < p > 题目大意:给出一棵树的结点个数n,以及它的前序遍历和后序遍历,输出它的中序遍历,如果中序遍历不唯一就输出No,且输出其中一个中序即可,如果中序遍历唯一就输出Yes,并输出它的中序</ p >
195
+ < p > 主要是如何判断结果是否唯一,已知二叉树的前序和后序是无法唯一确定一颗二叉树的,因为可能会存在多种情况。当只有一个孩子节点的时候,无法判断这个孩子节点是左孩子还是右孩子</ p >
196
+ < p > 先查看中序遍历是否唯一,先序遍历顺序为:根左右,后序遍历顺序为:左右根,那么如果一个节点只包含左子节点或者只包含右子节点,但是根据上面的顺序可以发现,他们的先序遍历和后续遍历是没有发生变化的,例如:</ p >
197
+ < p > < img src ="https://i.loli.net/2020/03/05/HOCzKonSWIEtUf5.png " alt ="20190301161354433.png "> )< img src ="https://i.loli.net/2020/03/05/HOCzKonSWIEtUf5.png " alt ="20190301161354433.png "> )< img src ="https://i.loli.net/2020/03/05/HOCzKonSWIEtUf5.png " alt ="20190301161354433.png "> </ p >
198
+ < p > 此图中节点1,节点3,只含有左子节点或者右子节点,但是他们的先序遍历和后续遍历都是相同的:</ p >
199
+ < p > 先序遍历:1 2 5 3 4</ p >
200
+ < p > 后序遍历:5 4 3 2 1</ p >
201
+ < p > < strong > 所以只要父亲节点只包含一个子节点,那么这个答案就是不唯一的</ strong > </ p >
202
+ < p > 后序遍历和先序遍历得到中序遍历(例一为例)</ p >
203
+ < p > < img src ="https://i.loli.net/2020/03/05/jFwO1GVPpbNIHzu.png " alt ="20190301162154255.png "> </ p >
204
+ < p > 先序遍历: 1 2 3 4 6 7 5 后序遍历: 2 6 7 4 5 3 1</ p >
205
+ < p > 在先序遍历中先取出开始的节点1,这个节点定为当前根节点,1后面一个节点2一定是节点1的一个子节点,然后在后序遍历中寻找节点2,于是便可知节点2(包括2)之前的位于节点1的左子树中,2(不包括2)后面的节点直至节点1,位于节点1的右子树</ p >
206
+ < p > 节点2 3 6 7 5位于节点1的右子树中,根据先序遍历可知3为这个子树的根节点,节点4为节点3的左或右子节点中的一个,后序遍历中找到节点4,可以知道节点6 7 4位于节点3的左子树中,节点5位于节点3的右子树中</ p >
207
+ < p > 依次类推,可以遍历完这棵树,于是便可得到中序遍历</ p >
208
+ < p > 如果上述中找到只包含一个子节点的父节点,没有发现另外一个节点,< strong > 即当前遍历区间中只包含当前节点的一个子节点</ strong > ,说明这个树是不唯一的,我们默认情况下将其安排在左子节点中</ p >
209
+ < figure class ="highlight c++ "> < table > < tr > < td class ="gutter "> < pre > < span class ="line "> 1</ span > < br > < span class ="line "> 2</ span > < br > < span class ="line "> 3</ span > < br > < span class ="line "> 4</ span > < br > < span class ="line "> 5</ span > < br > < span class ="line "> 6</ span > < br > < span class ="line "> 7</ span > < br > < span class ="line "> 8</ span > < br > < span class ="line "> 9</ span > < br > < span class ="line "> 10</ span > < br > < span class ="line "> 11</ span > < br > < span class ="line "> 12</ span > < br > < span class ="line "> 13</ span > < br > < span class ="line "> 14</ span > < br > < span class ="line "> 15</ span > < br > < span class ="line "> 16</ span > < br > < span class ="line "> 17</ span > < br > < span class ="line "> 18</ span > < br > < span class ="line "> 19</ span > < br > < span class ="line "> 20</ span > < br > < span class ="line "> 21</ span > < br > < span class ="line "> 22</ span > < br > < span class ="line "> 23</ span > < br > < span class ="line "> 24</ span > < br > < span class ="line "> 25</ span > < br > < span class ="line "> 26</ span > < br > < span class ="line "> 27</ span > < br > < span class ="line "> 28</ span > < br > < span class ="line "> 29</ span > < br > < span class ="line "> 30</ span > < br > < span class ="line "> 31</ span > < br > < span class ="line "> 32</ span > < br > < span class ="line "> 33</ span > < br > < span class ="line "> 34</ span > < br > < span class ="line "> 35</ span > < br > < span class ="line "> 36</ span > < br > < span class ="line "> 37</ span > < br > < span class ="line "> 38</ span > < br > < span class ="line "> 39</ span > < br > < span class ="line "> 40</ span > < br > < span class ="line "> 41</ span > < br > < span class ="line "> 42</ span > < br > < span class ="line "> 43</ span > < br > < span class ="line "> 44</ span > < br > < span class ="line "> 45</ span > < br > </ pre > </ td > < td class ="code "> < pre > < span class ="line "> < span class ="meta "> #< span class ="meta-keyword "> include</ span > < span class ="meta-string "> <bits/stdc++.h></ span > </ span > </ span > < br > < span class ="line "> < span class ="keyword "> using</ span > < span class ="keyword "> namespace</ span > < span class ="built_in "> std</ span > ;</ span > < br > < span class ="line "> < span class ="keyword "> const</ span > < span class ="keyword "> int</ span > maxn = < span class ="number "> 30</ span > + < span class ="number "> 10</ span > ;</ span > < br > < span class ="line "> </ span > < br > < span class ="line "> < span class ="keyword "> int</ span > pre[maxn], post[maxn];</ span > < br > < span class ="line "> < span class ="built_in "> vector</ span > << span class ="keyword "> int</ span > > in;</ span > < br > < span class ="line "> < span class ="keyword "> bool</ span > flag;</ span > < br > < span class ="line "> < span class ="function "> < span class ="keyword "> void</ span > < span class ="title "> in_order</ span > < span class ="params "> (< span class ="keyword "> int</ span > preLeft, < span class ="keyword "> int</ span > preRight, < span class ="keyword "> int</ span > postLeft, < span class ="keyword "> int</ span > postRight)</ span > </ span > {</ span > < br > < span class ="line "> < span class ="keyword "> if</ span > (preLeft == preRight) {</ span > < br > < span class ="line "> in.push_back(pre[preLeft]);</ span > < br > < span class ="line "> < span class ="keyword "> return</ span > ;</ span > < br > < span class ="line "> }</ span > < br > < span class ="line "> < span class ="keyword "> if</ span > (pre[preLeft] == post[postRight]) {</ span > < br > < span class ="line "> < span class ="keyword "> int</ span > i = preLeft + < span class ="number "> 1</ span > ;</ span > < br > < span class ="line "> < span class ="keyword "> while</ span > (i <= preRight && pre[i] != post[postRight - < span class ="number "> 1</ span > ])</ span > < br > < span class ="line "> i++;</ span > < br > < span class ="line "> < span class ="keyword "> if</ span > (i - preLeft > < span class ="number "> 1</ span > ) < span class ="comment "> //父节点有两个子节点,结构唯一</ span > </ span > < br > < span class ="line "> in_order(preLeft + < span class ="number "> 1</ span > , i - < span class ="number "> 1</ span > , postLeft, postLeft + (i - preLeft - < span class ="number "> 1</ span > ) - < span class ="number "> 1</ span > ); < span class ="comment "> //左子树</ span > </ span > < br > < span class ="line "> < span class ="keyword "> else</ span > < span class ="keyword "> if</ span > (i - preLeft == < span class ="number "> 1</ span > ) < span class ="comment "> //父节点有一个子节点,则可左可右,结构不唯一</ span > </ span > < br > < span class ="line "> flag = < span class ="literal "> false</ span > ;</ span > < br > < span class ="line "> in.push_back(pre[preLeft]); < span class ="comment "> //根节点</ span > </ span > < br > < span class ="line "> in_order(i, preRight, postLeft + (i - preLeft - < span class ="number "> 1</ span > ), postRight - < span class ="number "> 1</ span > ); < span class ="comment "> //右子树</ span > </ span > < br > < span class ="line "> }</ span > < br > < span class ="line "> }</ span > < br > < span class ="line "> </ span > < br > < span class ="line "> < span class ="function "> < span class ="keyword "> int</ span > < span class ="title "> main</ span > < span class ="params "> (< span class ="keyword "> int</ span > argc, < span class ="keyword "> char</ span > < span class ="keyword "> const</ span > *argv[])</ span > </ span > </ span > < br > < span class ="line "> < span class ="function "> </ span > {</ span > < br > < span class ="line "> < span class ="keyword "> int</ span > N, i;</ span > < br > < span class ="line "> < span class ="built_in "> cin</ span > >> N;</ span > < br > < span class ="line "> < span class ="keyword "> for</ span > (< span class ="keyword "> int</ span > i = < span class ="number "> 0</ span > ; i < N; ++i)</ span > < br > < span class ="line "> < span class ="built_in "> cin</ span > >> pre[i];</ span > < br > < span class ="line "> < span class ="keyword "> for</ span > (< span class ="keyword "> int</ span > i = < span class ="number "> 0</ span > ; i < N; ++i)</ span > < br > < span class ="line "> < span class ="built_in "> cin</ span > >> post[i];</ span > < br > < span class ="line "> flag = < span class ="literal "> true</ span > ;</ span > < br > < span class ="line "> in_order(< span class ="number "> 0</ span > , N - < span class ="number "> 1</ span > , < span class ="number "> 0</ span > , N - < span class ="number "> 1</ span > );</ span > < br > < span class ="line "> < span class ="keyword "> if</ span > (flag)</ span > < br > < span class ="line "> < span class ="built_in "> cout</ span > << < span class ="string "> "Yes"</ span > << < span class ="built_in "> endl</ span > ;</ span > < br > < span class ="line "> < span class ="keyword "> else</ span > </ span > < br > < span class ="line "> < span class ="built_in "> cout</ span > << < span class ="string "> "No"</ span > << < span class ="built_in "> endl</ span > ;</ span > < br > < span class ="line "> < span class ="keyword "> for</ span > (i = < span class ="number "> 0</ span > ; i < N - < span class ="number "> 1</ span > ; ++i)</ span > < br > < span class ="line "> < span class ="built_in "> cout</ span > << in[i] << < span class ="string "> " "</ span > ;</ span > < br > < span class ="line "> < span class ="built_in "> cout</ span > << in[i] << < span class ="built_in "> endl</ span > ;</ span > < br > < span class ="line "> </ span > < br > < span class ="line "> < span class ="keyword "> return</ span > < span class ="number "> 0</ span > ;</ span > < br > < span class ="line "> }</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
210
+
211
+
212
+
213
+
214
+ </ div >
215
+ < div class ="article-info article-info-index ">
216
+
217
+
218
+
219
+
220
+
221
+ < p class ="article-more-link ">
222
+ < a class ="article-more-a " href ="/2020/03/05/1119%20Pre-%20and%20Post-order%20Traversals%20(30%E5%88%86)/ "> 展开全文 > > </ a >
223
+ </ p >
224
+
225
+
226
+
227
+ < div class ="clearfix "> </ div >
228
+ </ div >
229
+ </ div >
230
+ </ article >
231
+
232
+ < aside class ="wrap-side-operation ">
233
+ < div class ="mod-side-operation ">
234
+
235
+ < div class ="jump-container " id ="js-jump-container " style ="display:none; ">
236
+ < a href ="javascript:void(0) " class ="mod-side-operation__jump-to-top ">
237
+ < i class ="icon-font icon-back "> </ i >
238
+ </ a >
239
+ < div id ="js-jump-plan-container " class ="jump-plan-container " style ="top: -11px; ">
240
+ < i class ="icon-font icon-plane jump-plane "> </ i >
241
+ </ div >
242
+ </ div >
243
+
244
+
245
+ </ div >
246
+ </ aside >
247
+
248
+
249
+
250
+
251
+
174
252
< article id ="post-bean的生命周期 " class ="article article-type-post article-index " itemscope itemprop ="blogPost ">
175
253
< div class ="article-inner ">
176
254
0 commit comments