バイナリサーチツリーでの削除
-
29-09-2020 - |
質問
先生は、バイナリ検索ツリー内のノードを削除するためのこのアルゴリズムに説明されていますが、削除されるノードに1人の子供だけがある場合にどのように機能するかを理解することはできません(私はすでに理論的に動作する方法を知っています)。
アルゴリズム:
abc_delete(T, z) // z is the node that must be eliminated
{
if((z.left == NULL) && (z.right == NULL))
y = z;
else
y = abr_successor(z);
if(y.left != NULL)
x = y.left;
else
x = y.right;
if(x != NULL)
x.p = y.p;
if(y.p == NULL)
T.root = x;
else
{
if(y == (y.p).left)
(y.p).left = x;
else
(y.p).right = x;
}
if(y != z)
z.key = y.key;
return y;
}
abr_successor(x)
{
if(x == NULL)
return NULL;
if(x.right != NULL)
return abr_min(x.right)
y = x.p;
while(y != NULL && x == y.right)
{
x = y;
y = y.p;
}
return y;
}
.
解決
選択は確かに正しいです。
しかし、あなたの先生のコードのどちらかに問題はありません。これがCLRからの抜粋です。
挿入や削除の操作により、バイナリ検索ツリーで表される動的セットが変更されます。データ構造はこの変更を反映するように変更する必要がありますが、バイナリサーチツリープロパティが保留され続けるように。
私たちは確かに操作を最も簡単な方法や最速の方法で作ることを好む。ただし、修正は最も簡単な方法で、あるいはあらゆる簡単な方法でも変更を加える必要がありません。修正は最速の方法で、あるいは早い方法でさえも行われることを必要としません。削除操作が、特定のノード(およびこれ以上ノードがない)を持たない、指定されたバイナリ検索ツリーからすべてのノードを持つ別のバイナリ検索ツリーを作成する必要があります。残りのノードがバイナリ検索ツリーをどのように形成するかは、拘束が完全になくなります。
あなたの先生のコードは、おそらく仕事をする最も短いクリアコードです。私がそれを勉強するほど、私が見つけたより創意物。
他のヒント
あなたの絵は正しい解決策ですが、ur教師コードへのur構文解析は正確ではありません(u mis utらのコード)
私が最初にUR QIがコードを徹底的に読みませんでした&私は(1回目の写真/図面から)UR教師は相対的な順序よりも余分な条件を持つ特別な種類のBSTの削除操作を行っていますが、これは
ではありませんBSTから削除するとき(URコード変数に従うことを試みる、zは削除されるノードです)
zがリーフノード(子なし)の場合は、null
で親ポインタを置き換えるだけです。zが1つの子(左または右が関係ないかどうか)の場合、親ポインタはその唯一の子供を指して
それは非常に単純な符号化、半疑似コード
if(z.left== null){physical_delete(z、zriet);戻る(); //私たちは正しいサブツリーやなしだけを持っています }
//ここでは、左のサブツリーがある確かに
if(z. right== null){physical_delete(z、z.left);戻る(); }
// physical_deleteは2ndパラメータとして置き換えを持っていますが、UR教師コードのすべてのループはそれが2つのサブツリーを持っているものを見つけることです
Zが2人の子供を持っている場合は、その場所を取るためにそれらのうちの1人を選ばなければなりません、そしてここにはur教師のコードがあります(前の場合はじゃない)
UR PICで想像してください。「5」を削除すると、2つの子供の残りのサブツリーを調整するためのものです(7&3とその子供たちがBST制約を維持するノード12にリンクする方法)
詳細なトレースが必要な場合は、これをすることができますが、これがスタート
としてこれを見つけた場合に限ります。