30
バイナリツリーで2つのノードの最も低い共通祖先を見つける方法は?
ここでのバイナリツリーは、必ずしもバイナリ検索ツリーであるとは限りません。 構造は次のように解釈できます- 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)である)と私は信じています。しかし、これが間違っている可能性が高いです。:-) しかし、これは非常に大雑把なアプローチであり、いくつかのケースで失敗するかどうかはわかりません。この問題に対する他の(おそらくより最適な)解決策はありますか?