二叉树遍历之递归算法
2012-07-22 19:31
148 查看
二叉树的遍历算法有多种,典型的有先序遍历、中序遍历、后序遍历以及层序遍历。而且这些遍历的递归算法较为简单,代码很少,容易实现,本文就是汇总二叉树遍历的递归算法,非递归算法将在下一篇文章中进行总结。本文中用到的二叉树实例如下:
二叉树定义和辅助函数如下:
递归代码如下:
当二叉树高度为N时,此时递归层序遍历为最坏情况,时间复杂度为O(N^2)。当二叉树左右子树基本平衡时,时间复杂度为O(N),分析如下:
设访问第K层时间为T(k),则T(k)存在如下的递归公式:
当二叉树平衡时,则高度为O(lgN),则总时间为:
3 / \ 9 20 / \ 15 7
二叉树定义和辅助函数如下:
struct node { int data; struct node* left; struct node* right; }; void visit(int data) { printf("%d ", data); }
1、先序遍历
先序遍历:先访问二叉树的根结点,而后遍历左子树,最后遍历右子树。先序遍历二叉树实例结果为:3 9 20 15 7。递归算法代码如下:void preOrder(struct node* root) { if (root == NULL) return; visit(root->data); preOrder(root->left); preOrder(root->right); }
2、中序遍历
中序遍历:先遍历二叉树的左子树,然后访问根结点,最后遍历右子树。中序遍历二叉树实例结果:9 3 15 20 7。递归算法代码如下:void inOrder(struct node* root) { if (root == NULL) return; inOrder(root->left); visit(root->data); inOrder(root->right); }
3、后序遍历
后序遍历:先遍历二叉树的左子树,然后遍历二叉树右子树,最后访问根结点。后序遍历二叉树实例结果:9 15 7 20 3。递归算法代码如下:void postOrder(struct node* root) { if (root == NULL) return; postOrder(root->left); postOrder(root->right); visit(root->data); }
4、层序遍历
对于先序遍历、中序遍历以及后序遍历的递归算法,没有什么好说的,时间复杂度都为O(n)。而层序遍历的递归算法则稍微复杂一点,因为本身层序遍历用非递归算法是很容易实现的,不过使用递归算法代码更简洁,虽然递归算法的效率并不高。层序遍历二叉树实例结果:3 9 20 15 7
递归代码如下:
void printLevel(struct node *p, int level) { if (!p) return; if (level == 1) { visit(p->data); } else { printLevel(p->left, level-1); printLevel(p->right, level-1); } } void printLevelOrder(struct node *root) { int height = maxHeight(root); //maxHeight计算二叉树高度,如二叉树实例高度为3 for (int level = 1; level <= height; level++) { printLevel(root, level); printf("\n"); } }
当二叉树高度为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)
相关文章推荐
- 第九周||项目2二叉树的的遍历递归算法
- 第十周项目(2):二叉树的遍历递归算法
- 八.二叉树各种操作的C语言实现 二叉树中各种遍历的非递归和递归算法的实现
- 【项目2】--二叉树的遍历递归算法
- 实现二叉树的先序遍历、中序遍历、后序遍历的递归非递归算法以及层次遍历算法
- 遍历二叉树的递归算法
- 先序遍历二叉树的递归算法怎样理解
- 二叉树的遍历算法 递归算法
- JAVA中二叉树非递归算法前序,中序,层序遍历
- 二叉树遍历之递归算法
- 第十周 项目2 二叉树的遍历递归算法
- 二叉树遍历之递归算法
- JAVA实现二叉树的遍历的非递归算法及递归算法(前序,中序,后序,层次)
- 先序扩展序列建立二叉树;先序、中序、后序遍历的递归算法(树)
- 二叉树的前中后序遍历的递归非递归算法
- 二叉树遍历之递归算法
- 先序遍历建立并输出二叉树(递归算法)
- 二叉树遍历之递归算法
- Java写的一个二叉树三种遍历递归算法(仅用作理解三种遍历)
- 二叉树的遍历: 前序,中序,后序----非递归算法