Tôi đang có thời gian khó khăn nhất để tìm ra cách cân bằng cây AVL cho lớp học của mình. Tôi đã có nó chèn với điều này:cân bằng cây 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;
}
Kế hoạch của tôi là có các cuộc gọi để cân bằng() kiểm tra xem cây có cần cân bằng và sau đó cân bằng khi cần thiết. Vấn đề là, tôi thậm chí không thể tìm ra cách đi qua cây để tìm nút không cân bằng chính xác. Tôi biết làm thế nào để đi qua cây một cách đệ quy, nhưng tôi dường như không thể dịch thuật toán đó thành việc tìm kiếm nút không cân bằng thấp nhất. Tôi cũng gặp khó khăn khi viết một thuật toán lặp. Bất kỳ trợ giúp sẽ được đánh giá cao. :)
Nhân tiện, nếu bạn quen thuộc với java, 'cho tôi' cuốn sách * Cấu trúc dữ liệu và thuật toán trong Java, bởi Lafore * đã giúp tôi rất nhiều hiểu cấu trúc dữ liệu. Mặc dù nó không có AVL nhưng nó nói rất nhiều về cây Red-Black, mà 'i' nếu tìm thấy dễ dàng hơn. Một khi bạn hiểu chúng trong Java, bạn có thể làm điều đó bằng bất kỳ ngôn ngữ nào khác mà bạn quen thuộc, toàn bộ vấn đề là hiểu cách chúng hoạt động – Carlos
@Carlos: Tôi đồng ý rằng miễn là ngôn ngữ không khó hiểu (perl ...) sẽ làm gì để chứng minh việc thực hiện thuật toán hoặc cấu trúc dữ liệu. –