您的位置:首页 > 其它

二叉树的前中后序+层次遍历

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: