二叉树的遍历是指通过一定顺序访问二叉树的所有结点。遍历的方法一般有四种:先序遍历、中序遍历、后序遍历及层次遍历,其中前三种一般使用深度优先搜索(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哈哈~