我不明白你为什么会考虑 O(N 2 ),除非我误解了这个问题。以下解决方案是前序遍历,因此每个节点最多访问一次:
struct node* visit(struct node* visited, int p, int q, struct node* sentinel) {
if (!visited) return visited;
if (visited->data == p || visited->data == q) {
struct node* t;
if ((t = visit(visited->left, p, q, visited))) return t;
if ((t = visit(visited->right, p, q, visited))) return t;
return sentinel;
} else {
struct node* left = visit(visited->left, p, q, visited);
struct node* right = visit(visited->right, p, q, visited);
if (left == visited) return right ? right : sentinel;
if (right == visited) return left ? left : sentinel;
return left ? left : right;
}
}
struct node* lca(struct node* root, int val1, int val2) {
return visit(root, val1, val2, 0);
}
我想一些解释是有序的,但也许因为它只是一个脑筋急转弯,最好把代码留在那里,看看人们是怎么理解的。(而且我也没有彻底测试它,让它看起来更像是一次采访。)
这不是我在采访中使用过的问题,如果有人提出上述代码作为答案,我不确定我会做什么。但后来我一直不确定我会雇用自己。