在算法:广度优先搜索(BFS)(最短路径)中,我们提到了按照广度优先遍历的搜索方式,使用队列作为常规的搜索方式,与之相对应的为深度优先搜索(DFS)。如果说BFS对应着树结构的前中后序遍历。但是DFS相对解法较为多元一些,有些时候不得不使用递归进行求解。同时,有很多求解只是进行图的遍历,不关心是广度还是深度优先,其解都是相同的。
二叉树的基本遍历:前中后序
在这里我们暂且不讨论的基于栈而是侧重基于递归的遍历实现。
对于二叉树,最常见的遍历方式有前序(又称 先序)遍历、中序遍历、后序遍历、层次遍历。前中后序只为取得的值先后顺序不同,即递归有先后。依赖栈实现的的深度优先是前序遍历。以下是一个二叉树的前序遍历代码实现:
//public class TreeNode<T> {
// public T val;
// public TreeNode<T> left;
// public TreeNode<T> right;
// public TreeNode(T x) { val = x; }
//}
public static void main(String[] args){
TreeNode<Integer> tree = …………;
inorderTraversal(tree);
}
private static List<Integer> inorderTraversal(TreeNode<Integer> root){
List<Integer> vals = new ArrayList<>();
inorder(root, vals);
return vals;
}
private static void inorder(TreeNode<Integer> node, List<Integer> vals) {
if (node == null) return;
//前序对应根-左-右
//定义遍历行为是按顺序输出
vals.add(node.val);
inorder(node.left, vals);
inorder(node.right, vals);
//如果改成这样 左根右 就是中序遍历
//inorder(node.left, vals);
//vals.add(node.val);
//inorder(node.right, vals);
}
这种递归遍历是DFS的基础,譬如,求二叉树的最大深度(当然也可以用BFS实现)

