📜  门| GATE-IT-2004 |问题 18(1)

📅  最后修改于: 2023-12-03 15:12:44.701000             🧑  作者: Mango

门(GATE-IT-2004)问题18

该问题涉及基于树的数据结构和遍历。在这个问题中,我们需要遍历一棵树来查找两个节点的共同祖先。

问题描述

给定一棵根节点为r的二叉树,以及两个节点a和b。我们需要找出这两个节点的共同祖先。我们假设a和b都存在于该树中。

解决方案

我们可以使用递归的方式来找到a和b的共同祖先。首先,我们递归遍历左子树,并尝试在左子树中找到a和b的共同祖先。如果在左子树中找到了共同祖先,我们可以直接返回结果。否则,我们递归遍历右子树,尝试在右子树中找到共同祖先。如果在右子树中找到了共同祖先,我们可以直接返回结果。如果左右子树中都没有找到共同祖先,那么当前节点就是a和b的最小公共祖先。

在进行递归遍历时,我们需要检查当前节点是否是a或b。如果当前节点是a或b,则我们可以直接返回当前节点作为一个共同祖先。如果当前节点是空节点,则直接返回null。

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    if (root == null) {
        return null;
    }
    if (root == p || root == q) {
        return root;
    }
    TreeNode leftLCA = lowestCommonAncestor(root.left, p, q);
    TreeNode rightLCA = lowestCommonAncestor(root.right, p, q);
    if (leftLCA == null) {
        return rightLCA;
    } else if (rightLCA == null) {
        return leftLCA;
    } else {
        return root;
    }
}
总结

该问题可以使用递归的方式来解决。当我们找到共同祖先时,我们可以直接返回结果。这种方法的时间复杂度为O(n),空间复杂度为O(h),其中n是节点数,h是树的高度。