现在的位置: 首页 > 综合 > 正文

二叉树遍历之递归算法

2013年12月04日 ⁄ 综合 ⁄ 共 1192字 ⁄ 字号 评论关闭

 二叉树的遍历算法有多种,典型的有先序遍历、中序遍历、后序遍历以及层序遍历。而且这些遍历的递归算法较为简单,代码很少,容易实现,本文就是汇总二叉树遍历的递归算法,非递归算法将在下一篇文章中进行总结。本文中用到的二叉树实例如下:

     3
   /  \
  9   20
     /  \
    15    7

二叉树定义和辅助函数如下:

  1. struct node {  
  2.     int data;  
  3.     struct node* left;  
  4.     struct node* right;  
  5. };  
  6.   
  7. void visit(int data)  
  8. {  
  9.     printf("%d ", data);  
  10. }  

1、先序遍历

先序遍历:先访问二叉树的根结点,而后遍历左子树,最后遍历右子树。先序遍历二叉树实例结果为:3  9 20 15 7。递归算法代码如下:

  1. void preOrder(struct node* root)  
  2. {  
  3.     if (root == NULL)  
  4.         return;  
  5.     visit(root->data);  
  6.     preOrder(root->left);  
  7.     preOrder(root->right);  
  8. }  


2、中序遍历

中序遍历:先遍历二叉树的左子树,然后访问根结点,最后遍历右子树。中序遍历二叉树实例结果:9 3 15 20 7。递归算法代码如下:

  1. void inOrder(struct node* root)  
  2. {  
  3.     if (root == NULL)  
  4.         return;  
  5.     inOrder(root->left);  
  6.     visit(root->data);  
  7.     inOrder(root->right);  
  8. }  


3、后序遍历

后序遍历:先遍历二叉树的左子树,然后遍历二叉树右子树,最后访问根结点。后序遍历二叉树实例结果:9 15 7 20 3。递归算法代码如下:

  1. void postOrder(struct node* root)  
  2. {  
  3.     if (root == NULL)  
  4.         return;  
  5.     postOrder(root->left);  
  6.     postOrder(root->right);  
  7.     visit(root->data);  
  8. }  

4、层序遍历

对于先序遍历、中序遍历以及后序遍历的递归算法,没有什么好说的,时间复杂度都为O(n)。而层序遍历的递归算法则稍微复杂一点,因为本身层序遍历用非递归算法是很容易实现的,不过使用递归算法代码更简洁,虽然递归算法的效率并不高。层序遍历二叉树实例结果:

3
9 20
15 7

递归代码如下:

抱歉!评论已关闭.