二叉树的深度优先遍历(DFS)与广度优先遍历(BFS)
深度优先遍历:从根节点出发, 沿着左子树的方向进行纵向遍历,直到找到叶子节点为之, 然后回溯到前一个节点, 进行右子树节点的遍历,直到遍历完所有可达节点为止
广度优先遍历: 从根节点出发,在横向遍历二叉树层段节点的基础上纵向遍历二叉树层次
A
B C
D E F G
DFS: ABDECFG
BFS: ABCDEFG
非递归
DFS实现: 数据结构 (栈)
父节点入栈, 父节点出栈, 先右子节点入栈, 后左子节点入栈, 递归遍历全部节点
public void depthFirstSearch(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new ArrayList<>();
if (null == root) return;
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
list.add(node.val);
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.right);
}
}
}
BFS实现: 数据结构 (队列)
父节点入队,父节点出队列,先左子节点入队,后右子节点入队。递归遍历全部节点即可
public void breadthFirstSearch(TreeNode root) {
Queue<TreeNode> queue = new Queue<>();
List<Integer> list = new ArrayList<>();
queue.push(root);
while (!queue.isEmpty()) {
TreeNode node = queue.pop();
list.add(node.val);
if (node.left != null) {
queue.push(node.left);
}
if (node.right != null) {
queue.push(node.right);
}
}
}
递归
public void depthOrderTraversalWithRecursive(TreeNode root) {
depthTraversal(root);
}
private void depthTraversal(TreeNode node) {
if (null == node) return;
depthTraversal(node.left);
depthTraversal(node.right);
}