树的遍历(前,中,后序)

在这里插入图片描述

树的遍历主要有四种
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];
			} 
	} 
}

在这里插入图片描述

### 回答1: 先序遍历遍历后序遍历都是二叉树遍历的方法,它们的区别在于访问根节点的顺序和访问左右子的顺序不同。 1. 先序遍历 先序遍历的访问顺序是:根节点 -> 左子 -> 右子。 例如,对于下面这棵二叉树: ``` 1 / \ 2 3 / \ / \ 4 5 6 7 ``` 其先序遍历序列为:1 2 4 5 3 6 7。 2. 遍历 遍历的访问顺序是:左子 -> 根节点 -> 右子。 例如,对于下面这棵二叉树: ``` 1 / \ 2 3 / \ / \ 4 5 6 7 ``` 其遍历序列为:4 2 5 1 6 3 7。 3. 后序遍历 后序遍历的访问顺序是:左子 -> 右子 -> 根节点。 例如,对于下面这棵二叉树: ``` 1 / \ 2 3 / \ / \ 4 5 6 7 ``` 其后序遍历序列为:4 5 2 6 7 3 1。 希望这个回答能够解决您的疑惑。 ### 回答2: 先序遍历遍历后序遍历二叉树的三种常见遍历方式。 先序遍历:先访问根节点,然后遍历左子,最后遍历右子。在遍历的过程,根节点总是在左子和右子被访问到。 遍历:先遍历左子,然后访问根节点,最后遍历右子。在遍历的过程,根节点总是在左子和右子之间被访问到。 后序遍历:先遍历左子,然后遍历右子,最后访问根节点。在遍历的过程,根节点总是在左子和右子之后被访问到。 以一个简单的二叉树为例,如下所示: A / \ B C / \ \ D E F 先序遍历:A -> B -> D -> E -> C -> F 遍历:D -> B -> E -> A -> C -> F 后序遍历:D -> E -> B -> F -> C -> A 其,先序遍历的访问顺序是根节点->左子->右子遍历的访问顺序是左子->根节点->右子后序遍历的访问顺序是左子->右子->根节点。 这三种遍历方式都有自己的应用场景。先序遍历常用于打印表达式,遍历常用于二叉搜索序输出,后序遍历常用于计算二叉树的表达式。 总之,先序遍历遍历后序遍历是对二叉树的不同遍历顺序,每种遍历方式都有自己的特点和应用场景。 ### 回答3: 先序遍历遍历后序遍历都是二叉树遍历的方法。下面分别对这三种遍历进行简单的说明。 先序遍历是指从根节点开始,先遍历根节点,然后按照先序遍历的顺序,递归遍历左子和右子。具体步骤如下:先输出根节点,然后递归遍历左子,最后递归遍历右子遍历是指从根节点开始,先递归遍历左子,然后输出根节点,最后再递归遍历右子。具体步骤如下:先递归遍历左子,然后输出根节点,最后递归遍历右子后序遍历是指从根节点开始,先递归遍历左子,然后递归遍历右子,最后输出根节点。具体步骤如下:先递归遍历左子,然后递归遍历右子,最后输出根节点。 这三种遍历方法都是通过递归的方式实现的,其先序遍历遍历的次序不同,而后序遍历的次序更为靠后。不同的遍历方式可以帮助我们了解二叉树结构的不同特点,如先序遍历可以轻松找到二叉树的根节点,遍历可以输出二叉树的有序节点序列,后序遍历可以方便地进行二叉树的删除操作。 总结起来,先序遍历遍历后序遍历都是二叉树遍历的方法,只不过它们的递归次序不同。熟练掌握这三种遍历方式可以帮助我们更好地理解二叉树的结构和特点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值