本文以如下树结构为例
深度优先(Deep First Search)
树的孩子称作子树,对于一个树进行深度优先遍历,即将其某一子树下所有节点遍历完再去遍历其他子树。遍历的顺序以根为参照可分为先序遍历,中序遍历,后序遍历。
遍历方式 | 描述 |
先序遍历 | 根左右 |
中序遍历 | 左根右 |
后序遍历 | 左右根 |
遍历顺序详解
先序遍历是按照根左右来遍历的,上述例子遍历过程为
0 (1 3 4)2 ->0 1 3 4 2
代码(JAVA)
先定义一个树结构。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
先序遍历DFS实现,将遍历结果按照先序遍历顺序放入一个List集合。
public static List<Integer> dfs(TreeNode node){
//存放遍历结果
List<Integer> result = new ArrayList<>();
if (node == null){
return null;
}else{
//先放入根节点
result.add(node.val);
}
TreeNode left = node.left;
TreeNode right = node.right;
//左子树
if (left!=null){
result.addAll(dfs(left));
}
//右子树
if (right!=null){
result.addAll(dfs(right));
}
return result;
}
测试,先定义一个上图例子中的树,然后进行先序遍历。
public static void main(String[] args) {
//定义例子中的树
TreeNode root = new TreeNode(0);
root.left = new TreeNode(1);
root.right = new TreeNode(2);
root.left.left = new TreeNode(3);
root.left.right = new TreeNode(4);
//先序遍历DFS
List<Integer> dfs = dfs(root);
System.err.println(dfs);
}
最后得出结果,和预想的一样。在树的算法中经常用到递归的思想,因为树的子树都是一个树,在实现过程中正确理解树对于实现很有帮助。
举一反三(LeetCode_94)
题目:94. 二叉树的中序遍历,给定一个二叉树的根节点 root ,返回它的 中序 遍历。
上边先序代码稍加修改实现如下。
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList();
if(root==null){
return result;
}
//中序遍历左根右
TreeNode left = root.left;
TreeNode right = root.right;
if(left!=null){
result.addAll(inorderTraversal(left));
}
result.add(root.val);
if(right!=null){
result.addAll(inorderTraversal(right));
}
return result;
}