二叉树的最近公共祖先

发布于 2021-09-12 17:27

01

题目

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

 

百度百科中最近公共祖先的定义为:“对于有根树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 = 4

输出: 5

解释: 节点 5 和节点 4的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

02


思路

我们采用递归标记的方式判断是否有p或q在节点的子树中,根据递归的性质,我们可以采取自下而上的标记方式,第一个标记p,q同时存在的节点就是最近公共祖先。

03


题解

    题解代码如下:

public TreeNode lowestCommonAncestor1(TreeNode root, TreeNode p, TreeNode q) {        //使用递归判断p或q是否在root的子树中,如果在从最底层返回root。否则返回空        if(root==p||root==q||root==null) return root;        //判断p,q在不在父节点的左子树中        TreeNode left = lowestCommonAncestor1(root.left,p,q);        //判断p,q在不在父节点的右子树中        TreeNode right = lowestCommonAncestor1(root.right,p,q);        //如果left为空,说明p,q全在右子树中,返回right。right同理。        //若p,q一个在左子树,另一个在右子树则说明root为最近公共祖先,返回root。        return left==null?right:(right==null?left:root);    }

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材