题目描述
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 示例 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的最近的公共祖先,我们最直观的思路是先找到p,q,返回它们最近的公共父节点。所以我们先判断的是子节点,再去判断父节点,因此采用:
后序遍历 - 确定了遍历顺序为
后序遍历,我们采用递归的思路来处理该后序遍历.
- 传入参数: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;
};
总结
以上便是二叉树最近公共祖先的所有内容,如有错误之处,欢迎大家指出,谢谢!