算法日志 --- 11.26---二叉树的最近公共祖先

67 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
    }
}

image.png