class TreeNode {
TreeNode parent;
TreeNode left;
TreeNode right;
// other data fields omitted - not relevant
}
p
とq
の2つのノードが指定されていますが、最も低い共通祖先はどのようにして見つけられますか? (両方が非常に大きな木に属していると仮定してください)ルートを参照することなく、2つのツリーノードの共通の祖先を見つけますか?
あなたはツリーのルートを参照していません。
これを行う最も効率的な方法は何ですか? はこれまでのところ、私が持っている唯一のアイデアは
(1)ノードp(これは関係ありません)
(2)のqを見れば、Pの左サブツリーを検索し、リターンP
を選ぶ にしました親に1つのレベルに行くとq見つかった場合 は、Pが含まれていないサブツリーを検索し、Qを見た場合(3)他に、Pの右側のサブツリーを検索し、リターンP
(4)他、返品親
(5) (4)( にはこの親が含まれていないサブツリーを検索してください)
これは非常に効率が悪いようです。任意のより良いアルゴリズムですか?
一度に1つのステップだけ「p」からトラバースアップします(親は1つだけです)。各ステップで、 'q'ノードを探して、左と右に完全に再帰します。見つかった場合はtrueを返し、そうでない場合はfalseを返します。途中で、各ノードに触れると、そのノードをダーティとマークして、高いレベルで再帰を繰り返す必要はありません。 –