二叉树遍历分为:深度优先遍历和广度优先遍历,在课堂上主要提及到的先序遍历,中序遍历和后序遍历属于深度优先遍历,广度优先遍历的主要实现是层级遍历。
二叉树本身属于图的一种,定义为连通的无环图,刚开始学习《算法4》这本书的时候还一直在翻目录,怎么没有提到重要的二叉树先序遍历,中序遍历和后序遍历呢?后来才拍拍脑门觉得自己太蠢了,写的深度优先和广度优先不就是为图设计的么,二叉树又本身就是图的一种。
二叉树的实现实际上就是一个递归的过程,现将自己的代码贴出来
public Node put(Node x,String key,Integer value) {
if (x == null) return new Node(key, value);
int cmp = key.compareTo(x.key);
if (cmp < 0) x.left = put(x.left, key, value);
else if (cmp > 0) x.right = put(x.right, key, value);
else x.value = value;
return x;
}
因此我们可以很方便的由递归来实现先中后序遍历二叉树,它们的实现代码大致相同,区别仅仅是打印的顺序不一。
/**
* 先序遍历
*
* 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
*
* @param node
* 遍历的节点
*/
public static void preOrderTraverse(Node node) {
if (node == null)
return;
System.out.print(node.data + " ");
preOrderTraverse(node.left);
preOrderTraverse(node.right);
}
/**
* 中序遍历
*
* 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
*
* @param node
* 遍历的节点
*/
public static void inOrderTraverse(Node node) {
if (node == null)
return;
inOrderTraverse(node.left);
System.out.print(node.data + " ");
inOrderTraverse(node.right);
}
后序就不贴出来了,就只是输出挪到了第三行,三序遍历的递归实现其实也可以看成输出前中后序挪位(笑~)
为什么会这样呢,简单分析一下其中一种:先序遍历,从根节点出发(根据定义,左右节点访问是先左后右),将传入实参的值打印出来(即根节点),然后向左遍历直到左子树的最左端 即3号点,这时候它的左孩子(Left)指针为空,return,即又返回到了3号节点,执行下一步,遍历该节点的右子树的根节点 遍历顺序即123456,符合先序条件。
中序遍历一样的,只不过是先到最左的节点(3),然后执行输出打印,随即中序遍历3的右子树 输出序列为354621 (下图是从0)