二叉树遍历之递归算法

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

     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
递归代码如下:

  1. void printLevel(struct node *p, int level)  
  2.  {  
  3.   if (!p) return;  
  4.   if (level == 1) {  
  5.     visit(p->data);  
  6.   } else {  
  7.     printLevel(p->left, level-1);  
  8.     printLevel(p->right, level-1);  
  9.   }  
  10. }  
  11.    
  12. void printLevelOrder(struct node *root)   
  13. {  
  14.   int height = maxHeight(root);  //maxHeight计算二叉树高度,如二叉树实例高度为3  
  15.   for (int level = 1; level <= height; level++) {  
  16.     printLevel(root, level);  
  17.     printf("\n");  
  18.   }  
  19. }  

当二叉树高度为N时,此时递归层序遍历为最坏情况,时间复杂度为O(N^2)。当二叉树左右子树基本平衡时,时间复杂度为O(N),分析如下:

设访问第K层时间为T(k),则T(k)存在如下的递归公式:

T(k) = 2T(k-1) + c
     = 2k-1 T(1) + c
     = 2k-1 + c
当二叉树平衡时,则高度为O(lgN),则总时间为:
T(1) + T(2) + ... + T(lg N)
= 1 + 2 + 22 + ... + 2lg N-1 + c
= O(N)

转自:http://blog.csdn.net/sgbfblog/article/details/7773002

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树遍历递归算法是指在不使用递归的情况下,实现对二叉树遍历。常用的非递归算法有三种:非递归前序遍历、非递归中序遍历和非递归后序遍历。 以下是三种非递归遍历二叉树算法: 1. 非递归前序遍历二叉树 ```c void preOrderNRec(Tree root){ Tree stack[MAXSIZE], node; int k = -1; if (root == NULL){ printf("tree is empty-- \n"); return; } else{ k++; // 仿照一个栈 stack[k] = root; // 将根节点入栈 while (k > -1){ //出栈 node = stack[k--]; printf(" %c - ", node->data); // 先把右子树放进去,栈是先进去后出,所以下面的左子树先出 if (node->right != NULL){ stack[++k] = node->right; } if (node->left != NULL){ stack[++k] = node->left; } } } } ``` 2. 非递归中序遍历二叉树 ```c void inOrderNRec(Tree root){ Tree stack[MAXSIZE], node; int k = -1; if (root == NULL){ printf("tree is empty-- \n"); return; } else{ node = root; while (k > -1 || node != NULL){ while (node != NULL){ stack[++k] = node; node = node->left; } if (k > -1){ node = stack[k--]; printf(" %c - ", node->data); node = node->right; } } } } ``` 3. 非递归后序遍历二叉树 ```c void postOrderNRec(Tree root){ Tree stack[MAXSIZE], node, lastVisit; int k = -1; if (root == NULL){ printf("tree is empty-- \n"); return; } else{ node = root; while (k > -1 || node != NULL){ while (node != NULL){ stack[++k] = node; node = node->left; } node = stack[k]; if (node->right == NULL || node->right == lastVisit){ printf(" %c - ", node->data); lastVisit = node; k--; node = NULL; } else{ node = node->right; } } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值