私はこれを一日中見つめていて、少しどこかで手に入れましたが、それでも正しく動作していません!要素kをLL赤色の黒い木に「入れる」(実際に挿入するか、そこにあるかどうかを調べる)だけです。私は私の回転の方法が完璧に動作知っ左に傾いている黒い赤い木に要素を挿入するC++
Node * RPut(Node* p, const K& k, Node*& location)
{
// if you are at the bottom of the tree,
// add new node at bottom of the tree
if (p == 0)
{
// new red note with new data
location = NewNode(k, Data(), RED);
return location;
}
if(greater_(k,p->key_))
{
// if it's greater than the root, move down to the left child
p->left_ = Rput(p->left_, k, location);
}
// right subtree
else if (greater_(p->key_,k))
{
// but if the key is less than root, move down to right child
p->right_ = Rput(p->right_, k, location);
}
// if they are equal
else
{
location = p;
}
// code for rotating
// this sort of worked.
if(p->right_ && p->right_->IsRed())
{
p = RotateLeft(p);
if (p->left_->IsBlack())
{
p->SetBlack();
p->left_->SetRed();
}
}
if (p->left_ && p->left_->IsRed())
{ if (p->left_->left_ && p->left_->left_->IsRed())
{
p = RotateRight(p);
p->left_->SetBlack();
p->right_->SetBlack();
}
}
return p;
}
:ここに私の方法です。 5番目の要素(私はすべての組み合わせを試みたが、通常はしていない。)例えば、正しく挿入ABCDEが
d
b e
a c --
[赤ノードとしてB付き]
鉱山作品が、停止することになるまで、これが正しく挿入されここに、私を与えて:
ノーレッドノード。
誰でも明白な何かを見ている私は見落としているか、それとも正常に動作していないのですか?どのような助けも非常に感謝しています。 ありがとう!
私はしていません!私はこれに似たバリエーションを試しましたが、segフォルトの問題がありました。彼の論理に従ってやってみよう。 – Tee
あなたのコードにいくつかの正気のアサーションを入れる方法があるのだろうか? 'assert()'関数は何かがうまくいかない場合、遅くコンパイルされずに放置され、失敗が起こったときに何が失敗したかを伝えます。 – Richard
@ Tracy *私はこれに似たバリエーションを試しましたが、seg faultの問題がありました* - IMOの問題点は、C++は、あなたが教科書で読んだこと。これにはJavaのような言語が適しています。理由は、C++では、他の言語とは異なり、動的に割り当てられたメモリを適切に管理することを心配する必要があるからです。つまり、言語自体と実装しているデータ構造には2つの山があります。 – PaulMcKenzie