假設C++:
node* leastCommonParent(node *p, node *q)
{
node *pParent = parentNode(p);
while(pParent != 0)
{
node *qParent = parentNode(q);
while(qParent != 0)
{
if (0 == same(pParent, qParent))
return pParent;
qParent = parentNode(qParent);
}
pParent = parentNode(pParent);
}
return 0;
}
更新:沒有使用遞歸顯式聲明變量的版本如下。我相信它可以得到改進,並且可能永遠不會在當前形式的生產代碼中使用它。
node* qParent(node *p, node *q)
{
if (p == 0 || q == 0)
return 0;
if (same(p, q) == 0)
return p;
return qParent(p, q->parent);
}
node* pParent(node *p, node *q)
{
return qParent(p, q) ? qParent(p, q) : pParent(p->parent, q);
}
node * result = pParent(p, q);
好吧..我會接受答案,但無論如何要做到這一點,而不使用臨時節點。 – m4n1c
謝謝。該函數僅使用指向節點的指針,因此沒有任何節點的副本正在創建,這就是爲什麼我不完全確定爲什麼臨時節點會成爲問題。根據需求,人們可以在沒有指針的情況下使用遞歸。 –
我試着說明你沒有使用額外的變量或指針來保存地址。原因是這個問題在面試中被問到了朋友。據說他不應該使用任何臨時指針或變量。 – m4n1c