二叉树的搜索方式

72 阅读1分钟

对二叉树进行深度优先搜索和广度优先搜索有什么区别

树的定义和基础相关参考

oi-wiki.org/graph/tree-…

树的深度优先搜索

一般包含几个步骤:

  • 处理当前节点
  • 处理左子树
  • 处理右子树

根据上面三个步骤的顺序,可以分成前序遍历、中序遍历、后序遍历。

  • 前序遍历:根左右
  • 中序遍历:左根右
  • 后序遍历:左右根
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
        
        // 相关的应用
        // 求二叉树的最小深度
        // 求二叉树的最大宽度
    }
}