NC102 在二叉树中找到两个节点的最近公共祖先

描述 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。

数据范围:1≤n≤1000,树上每个节点的val满足 0<val≤100 要求:空间复杂度 O(1),时间复杂度 O(n)

注:本题保证二叉树中每个节点的val值均不相同。

思路:二叉树的题就直接递归了(应该有非递归的方法,用while循环,我懒得想)。先找到val为o1或o2的节点。找到了返回T,否则返回F。本来想返回布尔值的,但是我担心如果公共节点的值为0,我写if的时候0会不会当作False,所以就用T和F吧。

如果o1或o2在一个节点的左边则左边结果(leftResult)为T,如果在右边则右边结果(rightResult)为T。最近的公共节点,可能有两种种情况,

1)公共节点的值就为 o1 或 o2,公共节点的左分支或右分支有另一个 o2 或 o1。此时的情况就是公共节点为 T,rightResult 或 leftResult 有一个为 T

2)公共节点的 rightResult 为 T 且 leftResult 也为 T

如果是非公共节点,有三种情况:

1)本节点值为 o1 或 o2,此时返回 T

2)本节点的 rightResult 或 leftResult 为 T,此时返回 T

3)本节点的 rightResult 和 leftResult 都为 F,此时返回 F

# 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: TreeNode, o1: int, o2: int) -> int:
        # write code here
        result = ''
        if root == None:
            return 'F'
        elif (root.val == o1) | (root.val == o2):
            result = 'T'
        leftResult = self.lowestCommonAncestor(root.left, o1, o2)
        rightResult = self.lowestCommonAncestor(root.right, o1, o2)
        if result == 'T':
            if (leftResult == 'T') | (rightResult == 'T'):
                return root.val
            else:
                return result
        else:
            if leftResult == 'T':
                if rightResult == 'T':
                    return root.val
                else:
                    return 'T'
            elif leftResult == 'F':
                if rightResult == 'T':
                    return 'T'
                elif rightResult == 'F':
                    return 'F'
                else:
                    return rightResult
            else:
                return leftResult