这里的二叉树不一定是一个二叉查找树。
结构可以被视为-
struct node {
int data;
struct node *left;
struct node *right;
};
我和一个朋友能想出的最好的解决办法就是这样的
考虑 这个二叉树:
无序遍历的结果是-8,4,9,2,5,1,6,3,7
后序遍历的结果是-8,9,4,5,2,6,7,3,1
例如,如果我们想找到节点8和5的共同祖先,那么我们在无序树遍历中列出所有介于8和5之间的节点,在这种情况下恰好是[4,9,2]。然后我们检查这个列表中的哪个节点在后序遍历中最后出现,即2。因此,8和5的共同祖先是2。
这个算法的复杂性,我相信是 O (n)(O (n)对于顺序/后序遍历,其余的步骤也是 O (n) ,因为它们不过是数组中的简单迭代)。但这很有可能是错误的。:-)
但这是一个非常粗糙的方法,我不确定它是否会在某些情况下崩溃。对于这个问题还有其他(可能更优的)解决方案吗?