[LeetCode]236. 二叉树的最近公共祖先(java实现)
1. 题目
2. 读题(需要重点注意的东西)
- 二叉树的公共祖先问题:给定p,q两个节点,要求他们的公共祖先,只需要判断当前节点的p、q分别在当前节点的左右子树中即可。
- 本题的难点在于如何判断给定的节点与所判断的节点的位置
3. 解法
解法:递归遍历
/**
* 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) {
// 如果root为空,或者找到了p或q,返回该值
if(root == null || root.val == p.val || root.val == q.val) return root;
// 向左子树进行遍历
TreeNode left = lowestCommonAncestor(root.left,p,q);
// 向右子树进行遍历
TreeNode right = lowestCommonAncestor(root.right,p,q);
// 如果左右子树都存在返回值(不为空),则返回当前节点
if(left != null && right != null) return root;
// 如果左子树不为空,返回左子树
if(left != null) return left;
// 如果右子树不为空,返回右子树
return right;
}
}
4. 可能有帮助的前置习题
[LeetCode]235. 二叉搜索树的最近公共祖先(java实现)
5. 所用到的数据结构与算法思想
递归法
6. 总结
二叉树的公共祖先问题:给定p,q两个节点,要求他们的公共祖先,只需要判断当前节点的p、q分别在当前节点的左右子树中即可。