236-Lowest Common Ancestor of a Binary Tree

Description

Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

Given the following binary search tree: root = [3,5,1,6,2,0,8,null,null,7,4]

        _______3______
       /              \     ___5__          ___1__
   /      \        /      \    6      _2       0       8
         /  \          7   4

Example 1:

Input: root, p = 5, q = 1
Output: 3
Explanation: The LCA of of nodes 5 and 1 is 3.

Example 2:

Input: root, p = 5, q = 4
Output: 5
Explanation: The LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself
             according to the LCA definition.

问题描述

给定二叉树和两个节点 ,返回这两个节点的最近公共祖先

根据维基对最近公共祖先的定义, “v和w的最近公共祖先被定义为, 离v和w最近的以v和w为后继节点的节点(允许一个节点为自己的后继)”

问题分析

很经典的题目

首先, 若p为q的子节点, 那么返回q, 若q为p的子节点, 那么返回p

后序遍历, 若当前节点既包含p, 也包含q, 那么返回当前节点, 否则, 返回非空的一方(注意, 这里就包含了p和q, 其中一个节点为另一个节点的子节点这种情况, 若两者都为空, 则返回空)

解法

public class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null || root == p || root == q)  return root;

        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);

        if(left != null && right != null)   return root;
        return left != null ? left : right;
    }
}
点赞