LeetCode-236-二叉树的最近公共祖先

思路
参考236. 二叉树的最近公共祖先(后序遍历 DFS ,清晰图解)
代码
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null||root==p||root==q)return root;
TreeNode left=lowestCommonAncestor(root.left,p,q);
TreeNode right=lowestCommonAncestor(root.right,p,q);
if(left!=null&&right!=null)return root;
else if(left!=null)return left;
else if(right!=null)return right;
return null;
}
参考
//把两步合在一个方法里,有点难以理解。把两步分开,这样可能清晰一点。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) return null;
// 如果p,q为根节点,则公共祖先为根节点
if (root.val == p.val || root.val == q.val) return root;
// 如果p,q在左子树,则公共祖先在左子树查找
if (find(root.left, p) && find(root.left, q)) {
return lowestCommonAncestor(root.left, p, q);
}
// 如果p,q在右子树,则公共祖先在右子树查找
if (find(root.right, p) && find(root.right, q)) {
return lowestCommonAncestor(root.right, p, q);
}
// 如果p,q分属两侧,则公共祖先为根节点
return root;
}
private boolean find(TreeNode root, TreeNode c) {
if (root == null) return false;
if (root.val == c.val) {
return true;
}
return find(root.left, c) || find(root.right, c);
}
}
本文详细介绍了LeetCode中的236题——二叉树的最近公共祖先的解决方案。通过后序遍历和深度优先搜索(DFS)策略,实现寻找给定两个节点在二叉树中的最近公共祖先。代码示例中,首先检查根节点是否为目标节点,然后分别在左子树和右子树中递归查找,最后根据查找结果确定公共祖先。
492

被折叠的 条评论
为什么被折叠?



