二叉树的最近公共祖先

124 阅读2分钟

题目描述

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 示例 1:

image.png

输入:root = \[3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3

示例 2:

image.png

输入:root = \[3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身

思路

  1. 首先整理题意:最近公共祖先有两种情况:

image.png

image.png

  1. 求p,q的最近的公共祖先,我们最直观的思路是先找到p,q,返回它们最近的公共父节点。所以我们先判断的是子节点,再去判断父节点,因此采用:后序遍历
  2. 确定了遍历顺序为后序遍历,我们采用递归的思路来处理该后序遍历.
  • 传入参数:root,p,q
  • 终止条件:root==null————root;root==p||root==q ————root
  • 单层逻辑:
    • 递归左子树
    • 递归右子树
    • 若左右子树返回值均不为null,返回当前root
    • 若左子树返回为null,右子树返回不为null,返回右子树返回结果
    • 若右子树返回为null,左子树返回不为null,返回左子树返回结果

代码

// 遍历方式:后序遍历

function lowestCommonAncestor(root: TreeNode | null, p: TreeNode | null, q: TreeNode | null): TreeNode | null {
	//终止条件
    if(root==null) return root;
    //遇到p或者q节点,直接返回
    if(root==p||root==q) return root;

    //左
    let left=lowestCommonAncestor(root.left,p,q);

    //右
    let right=lowestCommonAncestor(root.right,p,q);

    // 中
    if(left&&right) return root;
    if(left!=null&&right==null) return left;
    if(left==null&&right!=null) return right;
};

image.png

总结

以上便是二叉树最近公共祖先的所有内容,如有错误之处,欢迎大家指出,谢谢!

image.png