二叉树的前中后序+层次遍历
2016-07-24 12:48
253 查看
终于自己搞定二叉树的4种遍历,单单看博客没有人讲还是很难懂得,建议大家学习的时候,看一遍博客,然后自己手动递归,就很容易懂了,不要用脑子去递归- -。
深刻理解下遍历的原理。
深刻理解下遍历的原理。
//所谓建树就是指的是给定一个一个节点可以找出他的左右孩子 //不建树求某一层次遍历(一般求前后遍历可以不建树) //精髓就是根据n来限制树枝的个数,写一个简单的三层满2叉树,自己手动递归一下就会懂 #include<iostream> #include<cstring> #include<cstdio> using namespace std; void print_postOrder(int n, char *pre, char *in) //n代表节点个数,pre前 in 中 post后,不建树用void { if(n <= 0) return; //最后一步肯定是传进来n = 1,然后pre[0] p = 0时候pre[0]= in[p],然后就return,输出最下面的左孩子 int cnt, p = 0; while(in[p] != pre[0]) p++; //求出左子树的叶子个数 print_postOrder(p, pre+1, in);//打印左子树 print_postOrder(n - p - 1, pre + p + 1, in + p + 1); //打印右子树 printf("%c", pre[0]); //打印根节点 ///根据需要输出的序列的不同,把这句话放在不同位置,改为post[n-1] } int main(void) { char inOrder[105], preOrder[105]; while(scanf("%s", preOrder) != EOF) { scanf("%s", inOrder); int n = strlen(preOrder); print_postOrder(n, preOrder, inOrder); printf("\n"); } return 0; } //根据后中求层次遍历 (层次遍历一般要先建树) /* 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 */ #include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; const int maxn = 35; int post[maxn], in[maxn], lch[maxn], rch[maxn]; int build(int n, int *in, int *post) //建树用int ,返回root { if(n <= 0) return -1; int root = post[n-1]; //因为从0开始,到n-1结束 int p = 0; while(in[p] != root) p++; //都是利用中序找出下次传入的n从而限制数量,p求出的是左孩子的数量 lch[root] = build(p, in, post); rch[root] = build(n-p-1, in+p+1, post+p); //因为return root ,所以孩子的数值直接返回给上一个 root return root; } void bfs(int root) //层次遍历,先把根节点 push进去,然后根据根节点不断把左右孩子push进去,注意顺序 { queue<int>q; q.push(root); int flag = 0; while(q.size()) { if(flag++) cout << ' '; root = q.front(); q.pop(); cout << root; if(lch[root] != -1) q.push(lch[root]); if(rch[root] != -1) q.push(rch[root]); } } int main(void) { int n; cin >> n; for(int i = 0; i < n; i++) cin >> post[i]; for(int i = 0; i < n; i++) cin >> in[i]; int root = build(n, in, post); //最终递归返回的是根节点 bfs(root); return 0; }
相关文章推荐
- Scala Map
- [LEETCODE]318. Maximum Product of Word Lengths
- 深入理解Java Servlet与Web容器之间的关系
- Codeforces Round #364 (Div. 2) C. They Are Everywhere 尺取法
- java DES加密解密源码
- 文章标题
- SICP_Python版第二章:集合的表示
- Linux基础入门
- hdu1317 负权最短路(Floyd+bellman)
- expect 提供用户名和密码的SSH自动登录脚本
- nyoj 1036 非洲小孩 【区间找点】
- HotFix介绍及HotFix开源项目推荐
- VS2015Intellisense智能提示的模式的切换
- webview跳转页面的返回操作不成功,死循环问题
- Java集合框架(下)
- python数学运算——numpy
- AudioManager 的使用
- NGUI ScrollView 回弹控制
- python threadpool多线程池的多种玩法
- Spring boot 嵌入的tomcat不能启动: Unregistering JMX-exposed beans on shutdown