質問が述べているように、平衡二分探索木でキー「k」の後継者を見つけるアルゴリズムを見つけようとしています。バランスの取れた BST は AVL ツリーと同じだと思います (間違っていたら訂正してください)。O(log n) 時間で 1 回のパスでこれを実行できることを望んでいましたが、私が見つけたすべてのことは、ツリーの右側を下ってから左側を下る必要があると言っています。私はツリー全体に慣れていないので、まだ少し混乱しています。どんな助けでも大歓迎です!
ありがとう。
質問が述べているように、平衡二分探索木でキー「k」の後継者を見つけるアルゴリズムを見つけようとしています。バランスの取れた BST は AVL ツリーと同じだと思います (間違っていたら訂正してください)。O(log n) 時間で 1 回のパスでこれを実行できることを望んでいましたが、私が見つけたすべてのことは、ツリーの右側を下ってから左側を下る必要があると言っています。私はツリー全体に慣れていないので、まだ少し混乱しています。どんな助けでも大歓迎です!
ありがとう。
二分探索木では、下に行くための 2 つのパス オプションがあります:左または右です。ここで、ノードNに要素kがあるとします。kよりも大きいツリーの最小要素であるkの後継者を見つけたいと考えています。
ここには 3 つの使用例があります。
S = Parent(P)から開始: S ≠ Root AND P ≠ Left(S)
S = Root およびP = Right(S)の場合、kはツリーの最大要素でした...それ以外の場合は、S ← Right(S)を設定した後、次のループを実行します。
S ≠ NULL の場合:
このループが終了すると、Pはkの後続を保持します。
キー k を持つノードに右のサブツリーがある場合、それはそのサブツリーの左端のノードです。それ以外の場合、キー k を持つノードが左の子である場合、それはこのノードの親です。それ以外の場合は、右のサブツリーを持つ直接の親以外のノードの最も近い祖先を見つけます。これは、そのサブツリーの最も左のノードです。そのような祖先が存在しない場合、ノードは最大であり、後続ノードはありません。
ツリーはバランスが取れているため、O(log n) で常に見つけることができます。