下面首先介绍下二叉树遍历的定义以及分类,然后介绍递归法实现二叉树遍历。
二叉树的遍历指的是按照一定的搜索路径和规则对二叉树中的节点进行访问,使得每个节点被访问且仅被访问一次。(这里的一次访问可以理解成一次操作)
对二叉树的遍历操作可以分为:层次遍历,先根(DLR)遍历,中根(LDR)遍历,后根(LRD)遍历。对应的定义及访问规则如下:
1.层次遍历操作
如果二叉树为空,则为空操作;否则先访问第0层的根节点,然后从左到右依次访问第一层的每个节点,然后是第二层的每个节点,依次类推,直到访问完最后一层的最后一个节点。按照层次遍历操作下面这个例子的访问顺序是:abcdefg
2.先根遍历操作
如果二叉树为空,则为空操作;否则(1)访问根节点,(2)先根遍历左子树,(3)先根遍历右子树。关键点是对于三角结构一定是按照根节点、左子节点。右子节点的顺序。那么按照先根遍历的操作,上面例子的访问顺序是abdgecf。为什么是这个顺序呢?这里解释下:非空,执行第一步访问根节点a,访问a的左子树(左子树的根节点为b),首先访问的是b(左子树的根节点),然后是b节点的左子树,访问的是d(b节点的左子树的根节点),然后是g,然后是e(b的右子树的根节点),然后是c(a节点的右子树根节点),然后是f(c节点的右子树的根节点)。(注意如果没有左子树或者右子树,直接跳过相应访问操作即可)。
后面两个有着类似的分析,不再累赘。
3.中根遍历操作
如果二叉树为空,则为空操作;否则(1)中根遍历左子树,(2)访问根节点,(3)中根遍历右子树。上面例子的访问顺序是gdbeacf。
4.后根遍历操作
如果二叉树为空,则为空操作;否则(1)后根遍历左子树,(2)后根遍历右子树,(3)访问根节点。上面例子的访问顺序是gdebfca。
可以看到上面234的定义是使用的递归定义的方式,那么对应的递归算法如下:(java版)
1.先根遍历实现的递归算法
public void preRootTraverse(BiTreeNode node)
{
if (node == null)
return; //为空则不进行任何操作
System.out.print(node.data + ” “);//访问根节点
preRootTraverse(node.leftChild); //递归遍历左子树
preRootTraverse(node.rightChild); //递归遍历右子树
}
2. 中根遍历实现的递归算法
public void inRootTraverse(BiTreeNode node)
{
if (node == null)
return; //为空则不进行任何操作
inRootTraverse(node.leftChild); //递归遍历左子树
System.out.print(node.data + ” “);//访问根节点
inRootTraverse(node.rightChild); //递归遍历右子树
}
3. 后根遍历实现的递归算法
public void postRootTraverse(BiTreeNode node)
{
if (node == null)
return; //为空则不进行任何操作
postRootTraverse(node.leftChild); //递归遍历左子树
postRootTraverse(node.rightChild); //递归遍历右子树
System.out.print(node.data + ” “);//访问根节点
}