LeetCode解题策略:二叉树最近公共祖先与数组乘积

需积分: 0 0 下载量 7 浏览量 更新于2024-06-30 收藏 1.26MB PDF 举报
"LeetCode 热门题目合集,包含两道算法问题的解析:236.二叉树的最近公共祖先和238.除自身以外数组的乘积。" 在LeetCode的热门题目中,我们经常会遇到一些挑战性的算法问题,这些问题能够帮助我们提升编程和数据结构理解能力。以下是这两道题目的详细解析: **236. 二叉树的最近公共祖先 (Lowest Common Ancestor in a Binary Tree)** 这是一个关于二叉树的问题,目标是找到给定二叉树中两个指定节点的最近公共祖先。最近公共祖先是指两个节点在树中的最近的共同父节点。问题描述了三种可能的情况: 1. 节点p和q分别位于根节点root的左右子树中。 2. 其中一个节点是根节点,另一个节点在其左或右子树中。 3. 节点p和q是同一子树中的节点。 解决这个问题可以使用递归的方法。首先,如果根节点为空,返回null;如果根节点等于其中一个节点,返回根节点;然后分别在左子树和右子树中查找p和q。如果在左右子树中都找到了节点,那么根节点就是最近公共祖先;如果只在左子树或右子树中找到一个节点,返回找到的那个节点。 **代码示例**(C++): ```cpp class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if (!root) return NULL; if (root == p || root == q) return root; TreeNode* left = lowestCommonAncestor(root->left, p, q); TreeNode* right = lowestCommonAncestor(root->right, p, q); if (left && right) return root; if (left) return left; else return right; } }; ``` **238. 除自身以外数组的乘积 (Product of All Numbers Except Self)** 该问题要求计算数组中每个元素去除自身后的乘积。一种直接的方法是使用两个数组分别记录每个元素左边和右边的乘积,但这样会占用额外的空间。更优的解决方案是利用前缀积的概念。 **前缀积**(Prefix Product)是指数组中从前向后连续元素的乘积,例如,对于数组`nums`,前缀积数组`prefixProd`满足`prefixProd[i] = nums[0] * nums[1] * ... * nums[i]`。 通过一次遍历,我们可以构建前缀积数组,然后再次遍历数组,用当前元素的前缀积除以当前元素得到去除自身后的乘积。这种方法的时间复杂度是`O(n)`,空间复杂度是`O(1)`。 **总结** LeetCode的这些热门题目锻炼了我们处理二叉树问题和数组操作的能力。通过递归方法解决二叉树问题,以及巧妙地使用前缀积概念优化数组操作,我们可以有效地解决实际编程中遇到的类似挑战。不断练习此类问题,将有助于提升算法思维和编程技巧。