博客
关于我
leetcode题解236-二叉树的最近公共祖先
阅读量:792 次
发布时间:2023-01-31

本文共 1694 字,大约阅读时间需要 5 分钟。

二叉树最近公共祖先的问题

在本文中,我们将探讨如何有效地找到二叉树中两个指定节点的最近公共祖先(LCA)。最近公共祖先的定义是两个指定节点的共同祖先,并且是可能的最深节点,这可能包括其中一个节点本身。

问题分析

给定一个二叉树,其中包含节点p和q,我们需要找到它们的最近公共祖先。根据题意,最近公共祖先可以是p或q本身,也可以是它们共享的最高祖先节点。

解题思路

我们采用递归法来解决这个问题。这种方法适用于层次遍历结构,能够有效地探索节点的路径。以下是详细的步骤:

  • 终止条件

    • 如果当前节点为空,返回null。
    • 如果当前节点是p或q,直接返回该节点。
  • 递归左、右子树

    • 递归左子树,获取左子树的LCA。
    • 递归右子树,获取右子树的LCA。
  • 处理返回值

    • 如果左子树返回null,说明p或q不在左子树中,直接返回右子树的结果。
    • 如果右子树返回null,同理,直接返回左子树的结果。
    • 如果两者都返回非null,则说明p和q分别位于根节点的左右子树中,根节点即为最近公共祖先。
  • 代码实现

    class Solution {   public TreeNode searchAncester(TreeNode root, TreeNode p, TreeNode q) {       if (root == null) {           return null;       }       if (root == p || root == q) {           return root;       } else {           TreeNode left = searchAncester(root.left, p, q);           TreeNode right = searchAncester(root.right, p, q);                      if (left == null) {               return right;           } else if (right == null) {               return left;           } else {               return root;           }       }   }      public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {       if (root == null) {           return null;       }       return searchAncester(root, p, q);   }}

    功能解释

    • searchAncester方法:这是递归函数,用于在树中搜索节点p和q,找到它们在根节点下的最近公共祖先。

      • 终止条件:检查当前节点是否为空或是否是目标节点p或q。
      • 递归左、右子树:分别递归左子树和右子树,获取各自的LCA。
      • 处理结果:根据左、右子树的LCA结果,确定整个树的LCA。
    • lowestCommonAncestor方法:这是入口函数,负责初始化树的根节点,并调用searchAncester方法进行搜索,返回树中节点p和q的最近公共祖先。

    示例验证

  • 示例1

    • 树:root = [3,5,1,6,2,0,8,null,null,7,4]
    • p = 5, q = 1
    • 输出:3(根节点3是5和1的最近公共祖先)
  • 示例2

    • 树:同样为root = [3,5,1,6,2,0,8,null,null,7,4]
    • p = 5, q = 4
    • 输出:5(5是两个节点的LCA)
  • 示例3

    • 树:root = [1,2]
    • p = 1, q = 2
    • 输出:1(1是两个节点的LCA)
  • 通过这些示例,可以验证我们的代码能够正确地找到较低层次或较高层次的最近公共祖先。代码逻辑严谨,RecursiveDepth较小,适用于较小规模的树,性能优越。

    转载地址:http://wegyk.baihongyu.com/

    你可能感兴趣的文章