码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树的后序遍历(暴力版) 小白菜oj 1034

时间:2017-08-21 23:02:58      阅读:502      评论:0      收藏:0      [点我收藏+]

标签:algo   nbsp   ace   clu   strlen   就会   有关   建立   iostream   

给出二叉树的前序遍历和中序遍历,求二叉树的后序遍历……

作为一个搜索蒟蒻,我真的没有办法很和谐的A掉,但估计过几天就会写有关这个题的和谐的解法……但只是估计……

下面讲述我的超暴力解法……

首先,先由前序遍历得到一个父亲节点,然后再由中序遍历得到这个父亲节点的左子树和右子树中的元素(中序遍历中,该点的左边的所有点,都在它的左子树,右边的都在它的右子树,子树中的根节点是在这些节点的前序遍历中排名最靠前的),然后递归建树,之后在递归求后序遍历即可。

但这个方法有两个比较……&¥……&的问题:
1.在取区间内前序遍历最靠前的节点时,如果用for循环,必炸无疑(数据范围大的话),所以我就想到了用线段树或树状数组来维护这个值……

2.建树的时候,如果树退化为一条链或类似链的很长的树,那用数组来存就崩掉了,于是我就想到了用指针的方法,因为以前写过几次用指针来建立Splay……

这样一来,写起来就显得非常麻烦了……很暴力……

果不其然,我没写出来……

于是本蒟蒻奉上一份没有解决以上两个问题的代码,虽然过不掉……但进行一些小数据的对拍还是有用的.....好牵强……

代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<string>
 5 #include<cmath>
 6 #include<algorithm>
 7 using namespace std;
 8 char tre[10000000];
 9 char qian[10000000],zhong[10000000],hou[10000000];
10 int qian_n[10000000],zhong_n[10000000],l,nume;
11 
12 void dfs(int num,int le,int r){
13     if(le>r) return;
14     int o=70000000;
15     int oo=70000000;
16     for(int i=le;i<=r;i++){
17         if(qian_n[zhong[i]]<o){
18             o=qian_n[zhong[i]];
19             oo=i;
20         } 
21     }
22     tre[num]=zhong[oo];
23     if(oo>0) dfs(num*2,le,oo-1);
24     if(oo<l) dfs(num*2+1,oo+1,r);
25 }
26 
27 void adfs(int x){
28     if(tre[x*2]!=*) adfs(x*2);
29     if(tre[x*2+1]!=*) adfs(x*2+1);
30     nume++;
31     hou[nume]=tre[x];
32 }
33 
34 int main(){
35     for(int i=0;i<=9999999;i++) tre[i]=*;
36     cin>>qian;
37     cin>>zhong;
38     l=strlen(qian)-1;
39     for(int i=0;i<=l;i++) qian_n[i+65]=i;
40     for(int i=0;i<=l;i++) zhong_n[i+65]=i;
41     dfs(1,0,l);
42     nume=0;
43     adfs(1);
44     for(int i=1;i<=l+1;i++) cout<<hou[i];
45     return 0;
46 }

 

二叉树的后序遍历(暴力版) 小白菜oj 1034

标签:algo   nbsp   ace   clu   strlen   就会   有关   建立   iostream   

原文地址:http://www.cnblogs.com/Misaki-Mei/p/7407077.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!