提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目描述
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
说明:
所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题过程
解题思路
一、递归做法。
详情参考:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/solution/mian-shi-ti-68-ii-er-cha-shu-de-zui-jin-gong-gon-7/
/**
* 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 || p == root || q == root){
return root;
}
TreeNode left = lowestCommonAncestor(root.left, p , q);
TreeNode right = lowestCommonAncestor(root.right, p , q);
if(left == null && right == null){
return null;//左右节点都为空,说明根节点不是公共祖先
}
if(left == null){
return right;//左节点为空,右节点不为空,说明根节点是一个公共节点,并且p和q可能在该根节点的右子树
}
if(right == null){
return left;
}
//左右节点都不等于null,表明根节点是公共节点
return root;
}
}
二、保存父亲节点的方法
1、用一个Map记录信息,key为当前节点的val,value为当前节点的父亲节点。遍历整棵树,每一个节点所对应的父亲节点都被记录下来了。
2、从p开始,回溯其父亲节点,并将对应的val放进集合中;
3、从q开始,回溯其父亲节点,判断是否已经被p遍历过,若是,则这个节点就是最近的祖先节点。
4、一套组合拳下来没找到最近祖先节点,返回null就好了。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
Map<Integer, TreeNode> father = new HashMap<>();
Set<Integer> set = new HashSet<>();
void dfs(TreeNode root){
if (root.left != null){
father.put(root.left.val, root);//存储当前节点值和它的父亲
dfs(root.left);
}
if (root.right != null){
father.put(root.right.val , root);
dfs(root.right);
}
}
//
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
dfs(root);
//从p开始往上回溯它的祖先,并将其加入集合
while (p != null){
set.add(p.val);
p = father.get(p.val);
}
while (q != null){
if (set.contains(q.val)){
return q;
}
q = father.get(q.val);
}
return null;
}
}
总结
暂时没有总结,待续。。。