您的位置:首页 > 其它

二叉树遍历之递归算法

2014-07-31 21:41 113 查看
作者:石锅拌饭 原文链接

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

3
/  \
9   20
/  \
15    7


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

[cpp] view
plaincopy

struct node {

int data;

struct node* left;

struct node* right;

};

void visit(int data)

{

printf("%d ", data);

}

1、先序遍历

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

[cpp] view
plaincopy

void preOrder(struct node* root)

{

if (root == NULL)

return;

visit(root->data);

preOrder(root->left);

preOrder(root->right);

}

2、中序遍历

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

[cpp] view
plaincopy

void inOrder(struct node* root)

{

if (root == NULL)

return;

inOrder(root->left);

visit(root->data);

inOrder(root->right);

}

3、后序遍历

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

[cpp] view
plaincopy

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

递归代码如下:

[cpp] view
plaincopy

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: