【前端面试】二叉树递归模板和题解

递归模板和步骤

递归题目的通用步骤

  1. 明确递归函数的功能:确定递归函数的输入参数和返回值,明确函数的功能。
  2. 基准情况(递归终止条件):设立一个或多个递归终止条件,确保递归能够结束。
  3. 递归步骤:将问题分解为更小的子问题,通过递归调用自身解决这些子问题。
  4. 合并结果:将子问题的解合并成原问题的解。

递归模板总结

1. 树的遍历(DFS)

前序遍历(根 -> 左 -> 右)

javascript 复制代码
function preorderTraversal(root) {
    let result = [];
    function traverse(node) {
        if (node !== null) {
            result.push(node.val);  // 访问根节点
            traverse(node.left);    // 递归遍历左子树
            traverse(node.right);   // 递归遍历右子树
        }
    }
    traverse(root);
    return result;
}

中序遍历(左 -> 根 -> 右)

javascript 复制代码
function inorderTraversal(root) {
    let result = [];
    function traverse(node) {
        if (node !== null) {
            traverse(node.left);    // 递归遍历左子树
            result.push(node.val);  // 访问根节点
            traverse(node.right);   // 递归遍历右子树
        }
    }
    traverse(root);
    return result;
}

后序遍历(左 -> 右 -> 根)

javascript 复制代码
function postorderTraversal(root) {
    let result = [];
    function traverse(node) {
        if (node !== null) {
            traverse(node.left);    // 递归遍历左子树
            traverse(node.right);   // 递归遍历右子树
            result.push(node.val);  // 访问根节点
        }
    }
    traverse(root);
    return result;
}
2. 二叉树的最大深度
javascript 复制代码
function maxDepth(root) {
    if (root === null) {
        return 0;
    }
    let leftDepth = maxDepth(root.left);
    let rightDepth = maxDepth(root.right);
    return Math.max(leftDepth, rightDepth) + 1;
}
3. 二叉树的最近公共祖先
javascript 复制代码
function lowestCommonAncestor(root, p, q) {
    if (root === null || root === p || root === q) {
        return root;
    }
    let left = lowestCommonAncestor(root.left, p, q);
    let right = lowestCommonAncestor(root.right, p, q);
    if (left !== null && right !== null) {
        return root;
    }
    return left !== null ? left : right;
}

递归题目的记忆技巧

  1. 确定递归函数的功能:明确函数的输入和输出,理解函数的目标。
  2. 设立基准情况:找到递归终止的条件,确保递归能够正确结束。
  3. 分解问题:将问题分解为更小的子问题,并通过递归调用解决。
  4. 合并结果:将子问题的解合并成原问题的解。
相关推荐
梵刹古音13 分钟前
【C语言】 字符数组相关库函数
c语言·开发语言·算法
学嵌入式的小杨同学7 小时前
从零打造 Linux 终端 MP3 播放器!用 C 语言实现音乐自由
linux·c语言·开发语言·前端·vscode·ci/cd·vim
wfeqhfxz25887827 小时前
YOLO13-C3k2-GhostDynamicConv烟雾检测算法实现与优化
人工智能·算法·计算机视觉
芝士爱知识a7 小时前
2026年AI面试软件推荐
人工智能·面试·职场和发展·大模型·ai教育·考公·智蛙面试
weixin_425543737 小时前
TRAE CN3.3.25 构建的Electron简易DEMO应用
前端·typescript·electron·vite·nestjs
Aaron15887 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
Mr Xu_8 小时前
【Vue3 + ECharts 实战】正确使用 showLoading、resize 与 dispose 避免内存泄漏
前端·信息可视化·vue·echarts
0思必得08 小时前
[Web自动化] Selenium设置相关执行文件路径
前端·爬虫·python·selenium·自动化
石去皿8 小时前
大模型面试通关指南:28道高频考题深度解析与实战要点
人工智能·python·面试·职场和发展
雯0609~8 小时前
hiprint:实现项目部署与打印1-官网提供普通html版本
前端·html