前言
一个简单的树结构图:
1. 深度优先遍历
深度优先遍历指的是,从树的根节点开始,先遍历左子树,然后遍历右子树。
我们借助栈结构来实现深度优先遍历。上图的深度优先遍历结果为:ABDECFG
应用场景: 前序遍历、中序遍历、后序遍历
例如《二叉树(#144 前序遍历、#94中序遍历、#145后序遍历)&深度优先遍历》
2. 广度优先遍历
从根节点开始,沿着树的宽度依次遍历树的每个节点。
我们借助队列结构来实现树的广度优先遍历。上图的遍历结果为:ABCDEFG
应用场景: 层序遍历
例如《#102 二叉树的层序遍历》 当然,这是变种的广度优先,因为需要对结果需要按层分组,遍历结果为 [ [A],[BC],[DEFG] ]
广度优先遍历代码实现,未变种,最原始的实现:
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Main2{
public ArrayList<Integer> BfsTree(TreeNode root) {
ArrayList<Integer> lists = new ArrayList<>();
if(root == null)
return lists;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode tree = queue.poll();
if(tree.left != null)
queue.offer(tree.left);
if(tree.right != null)
queue.offer(tree.right);
lists.add(tree.val);
}
return lists;
}
}
过程如下所示:
放入队列的顺序就是广度的顺序,即先放入第一层、再放入第二层、第三层…amazing
如果统计值,则在pop弹出的放入结果集合。
每次弹出一个节点后,则往队列中加入该节点的子节点。
如此往复。