题目链接:
236. 二叉树的最近公共祖先 - 力扣(LeetCode)
解题思路:
首先 题目指出,所给的 p,q节点是必然包含在 root 二叉树中,所以不会存在说没有答案
该题是适用于二叉树递归解决问题
在递归时 如果 root 为 null 说明当前无解 返回
if (root === null) return false;
我们定义 一个 dfs 函数来遍历这个二叉树,那么对于当前这道题会有俩种情况
let leftNode = dfs(root.left, p, q);
let rightNode = dfs(root.right, p, q);
当前节点的左子树和右子树分别包含了 p 和 q ,所以预存当前节点最近公共祖先
当前节点的左子树和右子树的其中一个包含 p 和 q,也预存当前节点为最近公共祖先
if (
(leftNode && rightNode) ||
((root.val === p?.val || root.val === q?.val) && (leftNode || rightNode))
) {
node = root;
}
最后我们返回所需要的当前节点是否包含 p q 节点的真值
return leftNode || rightNode || root.val === p?.val || root.val === q?.val;
代码:
function lowestCommonAncestor(
root: TreeNode | null,
p: TreeNode | null,
q: TreeNode | null
): TreeNode | null {
// 最近的祖先
let node: TreeNode | null = null;
function dfs(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null) {
if (root === null) return false;
let leftNode = dfs(root.left, p, q);
let rightNode = dfs(root.right, p, q);
// 俩种情况,第一种:当前节点就是包含p和q
// 第二种:左子树或者右子树其中一个包含
if (
(leftNode && rightNode) ||
((root.val === p?.val || root.val === q?.val) && (leftNode || rightNode))
) {
node = root;
}
// 返回
return leftNode || rightNode || root.val === p?.val || root.val === q?.val;
}
dfs(root, p, q);
return node;
}