添加用户输入以插入AVL树

问题描述

在我的代码中,我将代码硬编码在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 (将#修改为@)