问题描述
在我的代码中,我将代码硬编码在AVL树的插入中,但是我想对其进行更改,以便它可以接受用户输入的名称,并希望打印出名称,左右节点和平衡因子。这有一段时间了,我想搜索一个节点也要实现,但将来会有所帮助:)
**AVL tree.cpP**
int main(int argc,const char * argv []) {
int option;
do
{
cout << "\t1. Insert into an AVL Tree\n";
cout << "\t2. Print the contents of the AVL tree\n"; // menu
cout << "\t3. Exit\n";
cout << "\t\tEnter option : ";
cin >> option;
switch (option)
{
case 1:
//Insert
tree.InsertItem("David");
tree.InsertItem("Jack"); //the hard coded tree insert
tree.InsertItem("Harry");
break;
case 2:
tree.Print();
break;
} // end of switch
} while (option < 3);
return 0;
} //如果结束则结束
Tree.h
ifndef AvlClass_h
#define AvlClass_h
#include <iostream>
using namespace std;
typedef enum { LH,EH,RH } Balfactor;
template <class ItemType>
struct TreeNode
{
ItemType info;
TreeNode* left;
TreeNode* right;
Balfactor bf;
};
template <class ItemType>
class Tree
{
public:
void InsertItem(ItemType item);
void Print();
private:
TreeNode <ItemType>* root;
};
template <class ItemType>
void Tree<ItemType> ::Print()
{
Printpostorder(root);
}
template <class ItemType>
void Printpostorder(TreeNode<ItemType>*& tree)
{
if (tree == NULL)
return;
// first recur on left subtree
Printpostorder(tree->left);
// then recur on right subtree
Printpostorder(tree->right);
// Now deal with the node
cout << tree->info << "\n";
}
template <class ItemType>
void Tree<ItemType> ::InsertItem(ItemType item)
// Calls recursive function Insert to insert item into tree.
{
bool taller = false;
Insert(root,item,taller);
}
template <class ItemType>
void Insert(TreeNode<ItemType>*& tree,ItemType item,bool& taller)
// Inserts item into tree.
// Post:item is in tree; search property is maintained.
{
if (tree == NULL)
{ // Insertion place found.
tree = new TreeNode<ItemType>;
tree->left = NULL;
tree->right = NULL;
tree->info = item;
tree->bf = EH;
taller = true;
}
else if (item == tree->info)
cerr << "Duplicate key is not allowed in AVL tree." << endl;
else if (item < tree->info)
{
Insert(tree->left,taller);
// Insert into left subtree
if (taller)
switch (tree->bf)
{
case LH: LeftBalance(tree,taller);
break;
case EH: tree->bf = LH;
break;
case RH: tree->bf = EH;
taller = false;
break;
}
}
else
{
Insert(tree->right,taller);
// Insert into right subtree
if (taller)
switch (tree->bf)
{
case RH: RightBalance(tree,taller);
break;
case EH: tree->bf = RH;
break;
case LH: tree->bf = EH;
taller = false;
break;
}
}
}
template <class ItemType>
void RotateLeft(TreeNode<ItemType>*& tree)
{
TreeNode<ItemType>* rs;
if (tree == NULL)
cerr << "It is impossible to rotate an empty tree in RotateLeft" << endl;
else if (tree->right == NULL)
cerr << "It is impossible to make an empty subtree the root in RotateLeft" << endl;
else
{
rs = tree->right;
tree->right = rs->left;
rs->left = tree;
tree = rs;
}
}
template <class ItemType>
void RotateRight(TreeNode<ItemType>*& tree)
{
TreeNode<ItemType>* ls;
if (tree == NULL)
cerr << "It is impossible to rotate an empty tree in RotateRight" << endl;
else if (tree->left == NULL)
cerr << "It is impossible to make an empty subtree the root in RotateRight" << std::endl;
else
{
ls = tree->left;
tree->left = ls->right;
ls->right = tree;
tree = ls;
}
}
template <class ItemType>
void RightBalance(TreeNode<ItemType>*& tree,bool& taller)
{
TreeNode<ItemType>* rs = tree->right;
TreeNode<ItemType>* ls;
switch (rs->bf)
{
case RH:
tree->bf = rs->bf = EH;
RotateLeft(tree);
taller = false;
break;
case EH:
std::cerr << "Tree already balanced " << std::endl;
break;
case LH:
ls = rs->left;
switch (ls->bf)
{
case RH:
tree->bf = LH;
rs->bf = EH;
break;
case EH:
tree->bf = rs->bf = EH;
break;
case LH:
tree->bf = EH;
rs->bf = RH;
break;
}
ls->bf = EH;
RotateRight(tree->right);
RotateLeft(tree);
taller = false;
}
}
template <class ItemType>
void LeftBalance(TreeNode<ItemType>*& tree,bool& taller)
{
TreeNode<ItemType>* ls = tree->left;
TreeNode<ItemType>* rs;
switch (ls->bf)
{
case LH:
tree->bf = ls->bf = EH;
RotateRight(tree);
taller = false;
break;
case EH:
cerr << "Tree already balanced " << endl;
break;
case RH:
rs = ls->left;
switch (rs->bf)
{
case LH:
tree->bf = RH;
ls->bf = EH;
break;
case EH:
tree->bf = ls->bf = EH;
break;
case RH:
tree->bf = EH;
ls->bf = LH;
break;
}
rs->bf = EH;
RotateLeft(tree->left);
RotateRight(tree);
taller = false;
}
}
#endif /* AvlClass_h */
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)