私が問題を誤解していない限り、なぜあなたが O(N 2 ) を考えるのか理解できません。次のソリューションは事前順序トラバースであるため、各ノードを最大 1 回訪問します。
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);
}
なんらかの説明が必要だと思いますが、これは単なる頭の体操だったので、そのコードをそこに残して、人々がそれをどのように解釈するかを確認するのが最善です. (そして、インタビューのように見せるために、徹底的にテストしていません。)
これは私がインタビューで使用したことのない質問であり、誰かが上記のコードを答えとして思いついた場合、私が何をしたかわかりません. しかし、私は自分自身を雇ったかどうか確信が持てませんでした。