二叉树的遍历完整解析

二叉树的遍历是指通过一定顺序访问二叉树的所有结点。遍历的方法一般有四种:先序遍历、中序遍历、后序遍历及层次遍历,其中前三种一般使用深度优先搜索(DFS)实现,而实现层次遍历一般使用广度优先搜索(BFS)实现。前三种遍历方式在考试中考察较多,而先序遍历访问顺序是根结点->左子树->右子树,中序遍历的访问顺序是左子树->根结点->右子树,后续遍历的访问顺序是右左子树->右子树->根结点。

接下来以下图为例进行讲解三种遍历方式:
在这里插入图片描述
如何根据上面的访问顺序对二叉树进行遍历呢?首先我们要做的是就是好好记住下面的图像,这将非常有助于我们的理解:
在这里插入图片描述

上面这幅图表示啥意思呢,我们就以先序遍历为例,进行讲解:记住一句话,访问到一个结点后就将其看成根结点-左子树-右子树的结构.对于先序遍历,遍历顺序为根结点->左子树->右子树,首先先遍历根结点1,然后访问左子树结点2,然后将结点2再看成“根结点-左子树-右子树”结构,再利用遍历顺序根结点->左子树->右子树进行访问,遍历根结点2,再访问左子树结点3,然后将结点3看成"根结点-左子树-右子树"结构,再利用遍历顺序根结点->左子树->右子树进行访问,遍历根结点3…依次进行可访问上述结构,相应结构为:

先序遍历:a->b->d->e->c->f ;
中序遍历:d->b->e->a->c->f ;
后序遍历:d->e->b->f->c->a ;
相应的代码如下:
首先定义二叉树的存储结构:

struct TreeNode{  //二叉树数据结构
	int val;     //数据域val
	int layer;  //层次,层次遍历
	TreeNode* left;
	TreeNode* right;  //left,right左右子树指针
	// TreeNode(int x): val(x),left(NULL),right(NULL){}
};

新建结点的函数:

//新建结点

struct TreeNode* newNode(int val) 
{ 
    struct TreeNode* temp = new TreeNode; 
    temp->val = val; 
    temp->left = temp->right = NULL; 
    return temp; 
};  

二叉树的先序遍历实现代码:

void traversal_preorder(TreeNode *node,int layer){
	if(!node){
		return;
	}
	for(int i=0;i<layer;i++){
		printf("-----");
	}
	printf("[%d]\n",node->val );
	traversal_preorder(node->left,layer+1);
	traversal_preorder(node->right,layer+1);
}

二叉树的中序遍历代码实现:

void traversal_inorder(TreeNode *node,int layer){
	if(!node){
		return;
	}
	traversal_inorder(node->left,layer+1);
	for(int i=0;i<layer;i++){
		printf("-----");
	}
	printf("[%d]\n",node->val );
	traversal_inorder(node->right,layer+1);
}

二叉树的后序遍历代码实现:

void traversal_postorder(TreeNode *node,int layer){
	if(!node){
		return;
	}
	traversal_postorder(node->left,layer+1);
	traversal_postorder(node->right,layer+1);
	for(int i=0;i<layer;i++){
		printf("-----");
	}
	printf("[%d]\n",node->val );
}

二叉树的层次遍历的代码如下:

//层次遍历
void layerOrder(TreeNode* root,int layer){
	queue<TreeNode*> q; //注意队列里存放地址
	q.push(root); //将根结点地址入队
	while(!q.empty()){
		TreeNode* now = q.front(); //取出队首元素
		q.pop();
		for(int i=0;i<layer;i++){
			printf("-----");
		}
		printf("[%d]\n",now->val );
		if(now->left !=NULL){
			q.push(now->left);
			layer=layer+1;

		} 
		if(now->right !=NULL){
			q.push(now->right);
			layer=layer+1;
		} 
	}

}

相应的主函数如下:

int main(){
	
	struct TreeNode* root = newNode(1);
	root->left = newNode(2);
	root->left->left = newNode(3);
	root->left->right = newNode(4);
	root->right = newNode(5);
	root->right->right = newNode(6);
	//先序遍历
	printf("Binary tree preorder traversal: \n");
	traversal_preorder(root,0);

	//中序遍历
	printf("Binary tree inorder traversal: \n");
	traversal_inorder(root,0);

	//后序遍历
	printf("Binary tree postorder traversal: \n");
	traversal_postorder(root,0);
	//层次遍历
	printf("Binary tree layer traversal: \n");
	layerOrder(root,0);
	
	return 0;
}

对于二叉树的遍历的基础知识也就这些,还是需要我们自己画图多理解,这样才能在笔试或者面试中得心应手,加油吧,骚年们!!O(∩_∩)O哈哈~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值