我有最困難的時間試圖找出如何平衡我的課的AVL樹。我知道了這個插入:平衡一個AVL樹(C++)
Node* Tree::insert(int d)
{
cout << "base insert\t" << d << endl;
if (head == NULL)
return (head = new Node(d));
else
return insert(head, d);
}
Node* Tree::insert(Node*& current, int d)
{
cout << "insert\t" << d << endl;
if (current == NULL)
current = new Node(d);
else if (d < current->data) {
insert(current->lchild, d);
if (height(current->lchild) - height(current->rchild)) {
if (d < current->lchild->getData())
rotateLeftOnce(current);
else
rotateLeftTwice(current);
}
}
else if (d > current->getData()) {
insert(current->rchild, d);
if (height(current->rchild) - height(current->lchild)) {
if (d > current->rchild->getData())
rotateRightOnce(current);
else
rotateRightTwice(current);
}
}
return current;
}
我的計劃是有來電平衡()檢查,看看樹的需求平衡,然後平衡需要。麻煩的是,我甚至無法弄清楚如何遍歷樹來找到正確的不平衡節點。我知道如何遞歸遍歷樹,但似乎無法將該算法轉化爲找到最低的不平衡節點。我在編寫迭代算法時也遇到了麻煩。任何幫助,將不勝感激。 :)
順便說一句,如果你熟悉Java,'爲me'書*數據結構和算法在Java中,通過Lafore *幫了我很多理解數據結構。雖然它沒有AVL它廣泛地談論紅黑樹,如果找到更容易,它''我'。一旦你在Java中理解了它們,你就可以用你熟悉的任何其他語言來完成它,整個過程就是理解它們的工作方式 – Carlos 2010-11-18 22:32:49
@Carlos:我同意只要語言不是神祕的(perl),任何將會演示算法或數據結構的實現。 – 2010-11-19 07:48:29