有很多关于最近公共祖先算法的问题,但是这个问题与众不同,因为我正在尝试在编译时确定LCA,并且我的树既不是二叉树,也不是搜索树,尽管我的简化版本看起来像一个。
假设你有一堆结构,其中包含一个成员 typedef parent
,它是另一个类似结构体:
struct G
{
typedef G parent; // 'root' node has itself as parent
};
struct F
{
typedef G parent;
};
struct E
{
typedef G parent;
};
struct D
{
typedef F parent;
};
struct C
{
typedef F parent;
};
struct B
{
typedef E parent;
};
struct A
{
typedef E parent;
};
它们共同形成一棵树,如下所示:
A B C D
\ / \ /
E F
\ /
\ /
\ /
G
注意:结构体之间不存在继承关系。
我想要做的是创建一个类型特征 least_common_ancestor
,使得:
least_common_ancestor<A, B>::type; // E
least_common_ancestor<C, D>::type; // F
least_common_ancestor<A, E>::type; // E
least_common_ancestor<A, F>::type; // G
如何最好地做到这一点?
我不是特别关注算法复杂度,因为树的深度很小,我更想找到最简单的元程序,以得出正确的答案。
编辑:我需要能够在msvc2013等其他编译器中构建解决方案,因此最好不使用constexpr
。
constexpr
的 msvc2013 进行构建。 - Nicolas Holthausconstexpr
替换为const
,这只是对我来说更加简洁。我已经更新了答案。 - Holtenable_if
语句。 - Nicolas Holthaus