树的遍历主要有四种
1、先序遍历:先遍历根节点,再遍历左节点,最后遍历右节点;(根左右)
2、中序遍历:先遍历左节点,再遍历根节点,最后遍历右节点;(左根右)
3、后序遍历:先遍历左节点,再遍历右节点,最后遍历根节点;(左右根)
4、层序遍历:从根节点开始,从左到右,一层一层进行遍历;
例如:
先序遍历:FCADBEHGM
中序遍历:ACBDFHEMG
后序遍历:ABDCHMGEF
层序遍历:FCEADHGBM
1.先序遍历
1 /* 以递归方式 前序遍历二叉树 */
2 void PreOrderTraverse(BiTree t, int level)
3 {
4 if (t == NULL)
5 {
6 return ;
7 }
8 printf("data = %c level = %d\n ", t->data, level);
9 PreOrderTraverse(t->lchild, level + 1);
10 PreOrderTraverse(t->rchild, level + 1);
11 }
2.中序遍历
1 /* 以递归方式 中序遍历二叉树 */
2 void PreOrderTraverse(BiTree t, int level)
3 {
4 if (t == NULL)
5 {
6 return ;
7 }
8 PreOrderTraverse(t->lchild, level + 1);
9 printf("data = %c level = %d\n ", t->data, level);
10 PreOrderTraverse(t->rchild, level + 1);
11 }
3.后序遍历
1 /* 以递归方式 后序遍历二叉树 */
2 void PreOrderTraverse(BiTree t, int level)
3 {
4 if (t == NULL)
5 {
6 return ;
7 }
8 PreOrderTraverse(t->lchild, level + 1);
9 PreOrderTraverse(t->rchild, level + 1);
10 printf("data = %c level = %d\n ", t->data, level);
11 }
对比以上三种方法可以发现基本没有什么差别,只是 printf("data = %c level = %d\n ", t->data, level);的位置发生了变化
题目:
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct TNode* BinTree;
struct TNode{
int data; //存放数据域
BinTree left; //遍历左子树指针
BinTree right; //遍历右子树指针
};
BinTree getTree(int a[],int b[],int sum);
void Preorder(BinTree BT);
void LevelorderTraversal(BinTree BT,int n);
int main(){
int n;
scanf("%d",&n);
int a[n],b[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int j=0;j<n;j++){
scanf("%d",&b[j]);
}
BinTree BT=getTree(a,b,n);
LevelorderTraversal(BT,n);
return 0;
}
BinTree getTree(int a[],int b[],int sum){
int i;
BinTree BT;
if(sum==0) //sum为0代表此节点下子树不存数据,也就是不继续递归创建
return NULL;
else{
BT=(BinTree)malloc(sizeof(struct TNode)); //分配内存空间
BT->data=a[sum-1]; //把当前输入的数据存入当前节点指针的数据域中
for(i=0;i<sum;i++){
if(b[i]==a[sum-1])
break;
}
BT->left=getTree(a,b,i); //开始递归创建左子树
BT->right=getTree(a+i,b+1+i,sum-i-1); //开始到上一级节点的右边递归创建左右子树
}
return BT; //返回根节点
}
//先序遍历
void Preorder(BinTree BT){ //先序遍历二叉树
if(BT){
printf(" %d",BT->data);
Preorder(BT->left); //递归遍历左子树
Preorder(BT->right); //递归遍历右子树
}
}
void LevelorderTraversal(BinTree BT,int n){ //层序遍历
if(!BT)
return;
int len=1,pos,sum=0;
BinTree a[101],b[101];
a[0]=BT;
while(1){
if(len==0)
return;
pos=0;
for(int i=0;i<len;i++){
if(a[i]->left!=NULL) //如果它的左节点不为空就存在b数组里
b[pos++]=a[i]->left;
if(a[i]->right!=NULL) //如果它的右节点不为空就存在b数组里
b[pos++]=a[i]->right;
if(a[i]!=NULL){ //不为空输出
printf("%d",a[i]->data);
sum++;
}
if(sum!=n) //结果中间以空格隔开
printf(" ");
}
len=pos; //更新下一层宽度,为下一次循环做准备
for(int i=0;i<len;i++){ //将下层的b赋给a,为下一次循环做准备
a[i]=b[i];
}
}
}