🚩传送门:牛客题目

题目

树中一定存在公共祖先
给定一棵二叉树(保证非空)以及这棵树上的两个节点的 valo1o2,请找到 o1o2 的最近公共祖先节点。

示例 1:

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

解题思路:递归

我的代码

  1. public class Solution {
  2. public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
  3. // 1. root为空则不存在,返回-1
  4. if(root == null) return -1;
  5. // 2. 如果root为o1或o2中任意一个,则root就是公共祖先
  6. if(root.val == o1 || root.val == o2) return root.val;
  7. // 3. root不为o1或o2
  8. int left = lowestCommonAncestor(root.left, o1, o2); // 递归遍历左子树,只要在左子树中找到了o1或o2,则先找到谁就返回谁
  9. int right = lowestCommonAncestor(root.right, o1, o2);
  10. // 如果 left=-1,说明在左子树中一直找到叶子节点,也没找到o1或者o2
  11. if(left == -1) return right; // 所以最近公共祖先,必在右子树中,且right中第一个找的o1或者o2即为最近公共祖先
  12. // 如果 right=-1,说明在右子树中一直找到叶子节点,也没找到o1或者o2
  13. if(right == -1) return left; // 所以最近公共祖先,必在左子树中,且left中第一个找的o1或者o2即为最近公共祖先
  14. // 若left和right都不为-1,则说明o1,o2节点在root的异侧,则root为最近公共祖先
  15. return root.val;
  16. }
  17. }