0
点赞
收藏
分享

微信扫一扫

最近公共祖先

静鸡鸡的JC 2021-09-24 阅读 30
算法

牛客算法题

题目描述

给定一棵二叉树以及这棵树上的两个节点o1和o2,请找到o1和o2的最近公共祖先节点。

示例1

输入[3,5,1,6,2,0,8,#,#,7,4],5,1

返回值3

解答

最近公共祖先和o1,o2有三种关系:

  1. o1和o2分别在祖先左右两侧
  2. 祖先是o1,o2在祖先左右两侧
  3. 祖先是o2,o1在祖先左右两侧

使用dfs深度遍历,如果节点为o1,o2中其中一个直接返回,如果节点超过叶子节点也返回。

思路介绍

  • 对于树的题我们第一想法就是递归,那么对于这道题,我们同样是递归查询两个给定的两个节点o1、o2。
  • 如果这棵树的某个节点等于节点o1或者o2,那么就向上返回这个节点给父节点。
  • 如果当前节点的左右子树返回值分别是o1、o2那么当前这个节点就是最近公共祖先。
  • 如果当前节点只有一个子树的返回值为o1或o2节点,则返回该值
  • 如果当前节点的两个子树返回值都为空,则返回空指针

本题讲解视频连接

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

#
# 
# @param root TreeNode类 
# @param o1 int整型 
# @param o2 int整型 
# @return int整型
#
class Solution:
    def lowestCommonAncestor(self , root , o1 , o2 ):
        node = self.find(root,o1,o2)
        return node.val
    def find(self,root,o1,o2):
#         如果当前节点为空,或者当前节点等于o1或者等于o2就返回值给节点
        if not root or root.val==o1 or root.val==o2:
            return root
#         递归遍历左子树
        left = self.find(root.left,o1,o2)
#         递归遍历右子树
        right = self.find(root.right,o1,o2)
        #/如果left、right都不为空,那么代表o1、o2在root的两侧,所以root为他们的公共祖先
        if left and right:return root
        #如果left、right有一个为空,那么就返回不为空的哪一个
        return left if left else right
        # write code here
举报

相关推荐

0 条评论