二叉树是一种基本的数据结构,在程序员面试中经常会被考察。其中按一定顺序遍历所有节点是最基本的操作,很多知名的面试题目,例如求二叉树的深度、求出和为某一值的路径等等,本质上都是遍历的变种。本文试图从递归和非递归的角度来考察一下遍历的算法。
【遍历定义】
在二叉树中,每一个节点都有左右两个子节点(子节点可能为空,例如叶子节点)。根据节点和子节点访问的先后顺序,共有三种遍历方式:
- 前序遍历:先访问根节点,再访问左右子节点
- 中序遍历:先访问左子节点,再访问根节点,最后访问右子节点
- 后序遍历:先访问左右子节点,再访问根节点
例如,假定有下面一棵二叉树:
那么各节点遍历的顺序如下:
- 前序遍历:0,1,3,4,7,8,2,5,6
- 中序遍历:3,1,7,8,4,0,5,2,6
- 后序遍历:3,8,7,4,1,5,6,2,0
【递归实现】
用递归实现很简单,代码如下:
# 定义Node实现,用value存储值,并且有left、right两个节点分别指向左右两个子节点
class Node(object):
def __init__(self, value, left = None, right = None):
self.value = value
self.left =