二叉树的遍历即访问树中所有的节点各一次,有以下三种遍历方式:
- 前序遍历:树根–>左子树–>右子树
- 中序遍历:左子树–>树根–>右子树
- 后序遍历:左子树–>右子树–>树根
前中后指的是树根的位置,例如前序遍历就是先访问树根,中序遍历是树根在中间,后序遍历是最后访问树根,遍历方式一定是先左子树后右子树。
下面我们用如下的二叉树进行举例,二叉树的建立可参考博客
http://blog.csdn.net/zd454909951/article/details/78794263
1、前序遍历
从根节点开始处理,根节点处理完往左子树走,直到无法前进再处理右子树。
遍历结果为:6 3 2 5 4 9 7 8
递归算法如下:
/*前序遍历*/
public static void PreOrder(TreeNode node) {
if(node!=null) {
System.out.print(node.value+" "); //输出节点
PreOrder(node.leftNode); //以相同的方法遍历左子树
PreOrder(node.rightNode); //以相同的方法遍历右子树
}
}
2、中序遍历
沿树的左子树一直往下,直到无法前进后退回父节点,再往右子树一直往下。如果右子树也走完了就退回上层的左节点,再重复左中右的顺序。
遍历结果为:2 3 4 5 6 7 8 9
递归算法如下:
/*中序遍历*/
public static void InOrder(TreeNode node) {
if(node!=null) {
InOrder(node.leftNode); //以相同的方法遍历左子树
System.out.print(node.value+" "); //输出节点
InOrder(node.rightNode); //以相同的节点遍历右子树
}
}
3、后序遍历
和前序遍历方法相反,把左子树和右子树处理完后才处理树根。
遍历结果为:2 4 5 3 8 7 9 6
递归算法如下:
/*后序遍历*/
public static void PostOrder(TreeNode node) {
if(node!=null) {
PostOrder(node.leftNode); //以相同的方法遍历左子树
PostOrder(node.rightNode); //以相同的方法遍历右子树
System.out.print(node.value+" "); //输出节点
}
}
编写测试代码如下:
public class Test {
static TreeNode rootNode;
public static void main(String[] args) {
int[] data= {6,3,5,9,7,8,4,2};
System.out.println("原始数组内容:");
for(int i=0;i<8;i++)
System.out.print(data[i]+" ");
System.out.println();
buildBtree(data); //调用buildBtree函数建立二叉树
System.out.println("以链表方式建立二叉树成功!\n");
System.out.println("前序遍历结果为:");
PreOrder(rootNode);
System.out.println();
System.out.println("中序遍历结果为:");
InOrder(rootNode);
System.out.println();
System.out.println("后序遍历结果为:");
PostOrder(rootNode);
}
}
程序运行结果: