对二叉树进行深度优先搜索和广度优先搜索有什么区别
树的定义和基础相关参考
树的深度优先搜索
一般包含几个步骤:
- 处理当前节点
- 处理左子树
- 处理右子树
根据上面三个步骤的顺序,可以分成前序遍历、中序遍历、后序遍历。
- 前序遍历:根左右
- 中序遍历:左根右
- 后序遍历:左右根
void dfs(TreeNode* root) {
if (root == nullptr) return;
// 处理左子树
dfs(root->left);
// 处理右子树
dfs(root->right);
// 处理当前节点
// 代码走到这里,说明左右子树已经处理完了,可以拿到左右子树的结果做一些处理
// 相关的应用
// 求二叉树的深度
// 树上DP
}
树的广度优先搜索
树的广度优先搜索,也叫层次遍历,也就是一层一层的遍历树,
一般使用队列来实现,一般包含几个步骤:
- 将根节点放入队列
- 循环直到队列为空
- 取出队列头部元素
- 将头部元素的左右子节点放入队列
void bfs(TreeNode* root) {
if (root == nullptr) return;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
// 处理当前层的节点,把当前层的子节点放进另一个临时队列,处理结束后再把临时队列移动给q
// 相关的应用
// 求二叉树的最小深度
// 求二叉树的最大宽度
}
}