我一直在研究用于插入的AVL树。我的插件工作正常,但我尝试过的每次旋转实现都不起作用。我一直在尝试不同的位置进行平衡,也只是在每次插入后尝试旋转,只是为了检查它是否会起作用,但我根本没有进行旋转。任何有关我的轮换不起作用的帮助将不胜感激。
头:
#ifndef LINKEDBINARYTREE_H
#define LINKEDBINARYTREE_H
#include <iostream>
#include <string>
using namespace std;
class LinkedBinaryTree {
private:
struct Node {
string word;
Node* left;
Node* right;
Node* parent;
int wordCount;
int height;
Node() : word(), left(NULL), right(NULL), parent(NULL), wordCount(1), height(1) {}
Node(string s, Node* l, Node* r, Node* p) {
word = s;
left = NULL;
right = NULL;
parent = p;
wordCount = 1;
height = 1;
}
};
Node* _root;
public:
LinkedBinaryTree();
~LinkedBinaryTree();
void insertNode(Node* node, string word);
void insert(string word);
void display(Node* ptr, int level);
Node* root();
void inOrder(Node* node);
void rightRotate(Node* node);
void leftRotate(Node* node);
void rightLeftRotate(Node* node);
void leftRightRotate(Node* node);
int avlNum(Node* node);
int height(Node* node);
int bfactor(Node* node);
void fixHeight(Node* node);
void balance(Node* node);
int n;
};
#endif
的.cpp:
#include "LinkedBinaryTree.h"
#include <algorithm>
void LinkedBinaryTree::inOrder(Node * node)
{
if (node == NULL)
return;
inOrder(node->left);
cout << node->word << " " << avlNum(node) << " : " ;
inOrder(node->right);
}
void LinkedBinaryTree::rightRotate(Node* node)
{
Node* temp;
temp = node->left;
node->left = temp->right;
temp->right = node;
temp->parent = node->parent;
node = temp;
if (temp->parent = NULL) {
_root = temp;
}
fixHeight(node);
fixHeight(node->right);
fixHeight(node->left);
}
void LinkedBinaryTree::leftRotate(Node * node)
{
Node* temp;
temp = node->right;
node->right = temp->left;
temp->left = node;
temp->parent = node->parent;
node = temp;
if (temp->parent = NULL) {
_root = temp;
}
fixHeight(node);
fixHeight(node->right);
fixHeight(node->left);
}
void LinkedBinaryTree::rightLeftRotate(Node * node)
{
rightRotate(node->left);
leftRotate(node);
}
void LinkedBinaryTree::leftRightRotate(Node * node)
{
leftRotate(node->right);
rightRotate(node);
}
int LinkedBinaryTree::height(Node * node)
{
int h = 0;
if (node != NULL) {
h = node->height;
}
return h;
}
int LinkedBinaryTree::bfactor(Node * node)
{
return height(node->right) - height(node->left);
}
void LinkedBinaryTree::fixHeight(Node * node)
{
int hl = height(node->left);
int hr = height(node->right);
node->height = (hl > hr ? hl : hr) + 1;
}
int LinkedBinaryTree::avlNum(Node * node)
{
int leftH = height(node->left);
int rightH = height(node->right);
int avlNum = rightH - leftH;
return avlNum;
}
LinkedBinaryTree::LinkedBinaryTree()
{
_root = NULL;
}
LinkedBinaryTree::~LinkedBinaryTree()
{
}
void LinkedBinaryTree::insertNode(Node* node, string word)
{
if (word < node->word) {
if (node->left != NULL)
insertNode(node->left, word);
else {
node->left = new Node(word, NULL, NULL, node);
}
}
else if (word > node->word)
{
if (node->right != NULL)
insertNode(node->right, word);
else {
node->right = new Node(word, NULL, NULL, node);
}
}
else if (word == node->word) {
node->wordCount++;
}
balance(node);
}
void LinkedBinaryTree::insert(string word) {
if (_root == NULL) {
_root = new Node(word, NULL, NULL, NULL);
n++;
}
else {
insertNode(_root, word);
n++;
}
}
void LinkedBinaryTree::display(Node* ptr, int level)
{
int i;
if (ptr != NULL)
{
display(ptr->right, level + 1);
printf("\n");
if (ptr == _root)
cout << "Root -> ";
for (i = 0; i < level && ptr != _root; i++)
cout << " ";
cout << ptr->word;
display(ptr->left, level + 1);
}
}
LinkedBinaryTree::Node * LinkedBinaryTree::root()
{
return _root;
}
void LinkedBinaryTree::balance(Node* node)
{
fixHeight(node);
if (bfactor(node) == 2) {
if (bfactor(node->right) < 0)
rightRotate(node->right);
else
leftRotate(node);
}
if (bfactor(node) == 2) {
if (bfactor(node->left) > 0)
leftRotate(node->left);
else
rightRotate(node);
}
}
主:
#include "LinkedBinaryTree.h"
#include <string>
int main() {
LinkedBinaryTree t;
t.insert("Yes");
t.insert("No");
t.insert("Maybe");
t.insert("Hopefully");
t.insert("Absolutely");
t.display(t.root(), 1);
cout << endl;
cout << endl;
t.inOrder(t.root());
system("PAUSE");
return EXIT_SUCCESS;
}
答案 0 :(得分:0)
您的代码中存在大量错误,但阻止轮换的错误是bfactor
中的第二次balance
检查错误。它应与-2
进行比较。
if (bfactor(node) == -2)
您遇到的另一个问题是if
函数Rotate
语句中的赋值(增加编译器警告级别会告诉您这些)。