C++ 查找树中两个节点的最小公共祖先

C++ 查找树中两个节点的最小公共祖先,c++,tree,nodes,C++,Tree,Nodes,我在一次采访中被问及这个问题,尽管我知道如何解决这个问题,但我没有回答。我不知道该怎么办的原因是,我被问到的问题是这样的: class Node{ int val; Node *left, *right; }; int LCA(int a, int b){ //your code here } 面试官想让我找到a和b最不相同的祖先。我问我们是否得到了一个指向我们正在搜索的树的根的指针,他说没有。所以我很困惑我该如何解决这个问题,因为我连一棵树都没有 在这种情

我在一次采访中被问及这个问题,尽管我知道如何解决这个问题,但我没有回答。我不知道该怎么办的原因是,我被问到的问题是这样的:

class Node{
      int val;
      Node *left, *right;
};

int LCA(int a, int b){
     //your code here
}
面试官想让我找到a和b最不相同的祖先。我问我们是否得到了一个指向我们正在搜索的树的根的指针,他说没有。所以我很困惑我该如何解决这个问题,因为我连一棵树都没有


在这种情况下,有可能找到最不常见的祖先吗?我应该假设我们得到了一个全局
节点*
,它是树的根还是什么?有没有人遇到过类似的问题?

没有,这是不可能的。要回答给您的问题,您需要能够找到节点与其祖先之间的路径。为此,您需要将节点作为起点,并在每个节点中引用父节点。或祖先(或祖先的祖先)作为起点,并引用每个节点中的子节点。

从您描述访谈互动的方式来看,我怀疑这是一个诡计问题。这可能是一个很弱的尝试,看看你是否坚持要澄清你的问题

如果是我,在得到没有根的反馈后,我会问是否有其他方式使节点值相互关联。如果节点具有数学关系,则可能不需要根节点来解决LCA问题

另一种策略是确定如何插入、删除和找到节点。也就是说,找出可用的API。你可能已经发现面试官会提供一个家长API


有时候,面试就像是一场冒险游戏,面试官真的希望你能从曲折的迷宫中走出来(不管这看起来多么不公平)

如果你没有一棵树可以操作,你怎么能在树上操作呢?也许LCA()函数应该是类的成员函数?如果
a
b
节点,返回的祖先也是
节点,那么它不应该是
节点LCA(节点a,节点b)
。尽管我问了多次,面试官还是坚持认为这是问题的“正确”形式。我想我对他错了的怀疑是正确的。然而,即使给定两个节点,如果没有到树根的节点,您如何找到他们的LCA?面试官是错的。我认为更有趣的问题是,如果没有根节点或某种父反向链接节点,您如何证明面试官是错的,这个问题无法解决。