Open songyy5517 opened 1 year ago
思路:递归后序遍历,自底向上返回公共祖先节点
复杂度分析
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param o1 int整型
* @param o2 int整型
* @return int整型
*/
public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
// write code here
// 1. 异常处理
if (root == null)
return -1;
// 2. 后序遍历,返回最近祖先
return postOrder(root, o1, o2).val;
}
TreeNode postOrder(TreeNode root, int o1, int o2){
// 1. 递归出口
if (root == null || root.val == o1 || root.val == o2)
return root;
// 2. 后序遍历
TreeNode left = postOrder(root.left, o1, o2);
TreeNode right = postOrder(root.right, o1, o2);
if (left != null && right != null)
return root;
return left == null ? right : left;
}
}
Key points:
2024/2/1 2024/6/5
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:
示例 2:
分析 这道题需要我们求二叉树中两节点的最近祖先。我们可以基于后序遍历(DFS)对整棵树进行递归遍历,遇到空节点返回null,遇到o1或o2返回对应的节点。因此,对应某个节点,其左右子树一共存在三种情况。
最后返回到达根节点的节点值。