私は自分で赤黒木を書くことに取り組んでいます。しかし、ルートを回転させる回転をテストすると、参照が多少失われます。
ツリー構造:
45
/ \
40x 70
/ \ /
7 41 50
/ \
6 39
回転ロジックは次のように述べています。「X(つまり40)を上げる方向に、45(ルート)を上にして回転します。」
つまり、これは右回転を意味し、結果は次のようになります。
40x
/ \
7 45
/ \ / \
6 39 41 70
/
50
ノード45が祖父母で、7が親で、41が現在であると仮定します。(順序が意味をなさないことはわかっていますが、無視してください。これは、すでに1回回転したためです)
コード:
//current is node 45
//parent is node 7
//grandparent is node 45 (root)
//first detach cross node (i.e. 41)
Node crossNode2 = grandparent.left.right;
grandparent.left.right = null; //detach
45
/ \
40x 70
/ \ /
7 null 50
/ \
6 39
grandparent.left = null;
45
/ \
null 70
/
50
current.right = grandparent;
40
/ \
7 45
/ \ / \
6 39 null 70
/
50
grandparent.left = crossNode2; //attach
40
/ \
7 45
/ \ / \
6 39 41 70
/
50
しかし、どういうわけかこのコードは機能しません。私がテストしたとき:
preorder
45, 39, 70, 50
breadth-first
45, 39, 70, 50
したがって、結果は実際には次のようになります。
45
/ \
39 70
/
50
誰かが私のローテーションコードの何が問題になっているのかヒントを教えてもらえますか?