开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
今天是周六,开启快乐周六,同时锻炼一下身体,为备婚做一下准备
二叉树的最近公共祖先
该题出自力扣的236题 —— 二叉树的最近公共祖先【中等题】
审题
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
- 这道题说来也不难理解,就是给出一个二叉树和两个节点,两个节点默认存在于二叉树之内,要找出这两个节点的公共祖先,也就是公共的父节点,因为父节点有可能是本身,例如p、q节点,q是p的子节点,那么最终就是返回p就可以
- 利用深度遍历的解决方法,加上递归
- 先做递归的结束条件,如果当前节点为空,则返空
- 递归条件,如果当命中节点p或者节点q,则返回当前节点
- 递归,节点的左节点和右节点
- 递归遍历整棵二叉树,若节点 p 在节点 root 的左(右)子树中,或 p=root ,则称 root 是 p 的祖先。
- p 和 q 在 root 的子树中,且分列 root 的 异侧(即分别在左、右子树中);
- p=root ,且 q 在 root 的左或右子树中;
- q=root ,且 p 在 root 的左或右子树中;
- 通过递归对二叉树进行先序遍历,当遇到节点 p 或 q 时返回。
编码
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null)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 != null && right != null) {
return root;
}else if (left != null) {
return left;
}else if (right != null){
return right;
}
return null;
}
}