我一直盯着這一整天,稍微有些地方,但它仍然不能正常工作!只是試圖'插入'(真的插入,或找到它是否存在)一個元素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;
}
我知道我的旋轉方法工作完美。此正確地插入,直到第五元件(I沒有嘗試每種組合,但通常。)例如,ABCDE正確插入將是
d
b e
a c --
[用b爲紅色節點]
礦山工作,但停止這裏,給我:
沒有紅色節點。
任何人都看到任何明顯的我忽略或爲什麼它不能正常工作?任何幫助都非常感謝。 謝謝!
我還沒有!我嘗試了一個類似於此的變化,並且遇到了seg故障問題。按照他的邏輯去嘗試。 – Tee
我不知道你是否能找到方法在代碼中加入一些理智的斷言?如果出現錯誤,'assert()'函數會拋出一些東西,可以在以後的速度中將它們排除在編譯之外,並告訴你什麼時候失敗發生了什麼。 – Richard
@Tracy *我嘗試了一個類似於此的變體,並且遇到了seg故障問題* - IMO的問題在於,如果您希望根據以下內容實現數據結構,則C++不是一個好的(應該說是理想的)語言你在課本上閱讀的內容。像Java這樣的語言更適合這一點。原因在於對於C++,與其他語言不同,您必須擔心正確管理動態分配的內存。所以你需要爬兩座山 - 語言本身和你正在實施的數據結構。 – PaulMcKenzie