二叉树的最近公共祖先

题目链接

二叉树的最近公共祖先

题目描述

二叉树的最近公共祖先_第1张图片
二叉树的最近公共祖先_第2张图片

注意点

  • 所有 Node.val 互不相同
  • p != q
  • p 和 q 均存在于给定的二叉树中

解答思路

  • 递归后续遍历整棵二叉树,保证从底向上找两个节点的最近公共祖先
  • 当找到公共节点后,再网上遍历也是两个节点的公共祖先,但不是最近公共祖先,所以要注意其他公共祖先节点不要将最近祖先覆盖了

代码

class Solution {
    TreeNode res;

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        res = null;
        postOrder(root, p, q);
        return res;
    }

    public boolean postOrder(TreeNode node, TreeNode p, TreeNode q) {
        if (node == null) {
            return false;
        }
        boolean leftVal = postOrder(node.left, p, q);
        boolean rightVal = postOrder(node.right, p, q);
        // 已找到最近公共祖先
        if (res != null) {
            return true;
        }
        if ((leftVal && rightVal) || ((leftVal || rightVal) && (node == p || node == q))) {
            res = node;
            return true;
        }
        return leftVal || rightVal || node == p || node == q;
    }
}

关键点

  • 判断某个位置是否是公共祖先的逻辑
  • 防止非最近公共祖先节点覆盖问题

你可能感兴趣的:(算法TOP100,数据结构,leetcode,算法,二叉树)