Все еще не могу найти наибольшее число в двоичном дереве - PullRequest
0 голосов
/ 19 ноября 2011

Я до сих пор не могу найти наибольшее число в своем дереве, но сейчас я действительно не усложняю его, думаю, что оно должно работать, ошибки нет, но она просто не будет отображаться в консоли.У кого-нибудь есть идея?Я очень расстроен.

Вот весь мой код:

#include <iostream>
#include <string>
#include <cstdlib> 


using namespace std;


template<class T>
class BinaryTree
{

struct Node
    {
        T data;
        Node* lChildptr;
        Node* rChildptr;

        Node(T dataNew)
        {
            data = dataNew;
            lChildptr = NULL;
            rChildptr = NULL;

        }
    };
private:
    Node* root; 

        void Insert(T newData, Node* &theRoot)
        {
            if(theRoot == NULL) 
            {
                theRoot = new Node(newData);
                return;
            }

            if(newData < theRoot->data)  
                Insert(newData, theRoot->lChildptr);
            else
                Insert(newData, theRoot->rChildptr);;
        }

        void PrintTree(Node* theRoot)
        {
            if(theRoot != NULL)
            {
                PrintTree(theRoot->lChildptr);
                cout<< theRoot->data<<" \n";;
                PrintTree(theRoot->rChildptr);
            }
        }
T Largest( Node* theRoot)
{
    if ( root == NULL ){
    cout<<"There is no tree";
    return -1;
    }

    if (theRoot->rChildptr != NULL)
        return Largest(theRoot->rChildptr);
    else
        return theRoot->data;
        cout<<theRoot->data;


}; 

    public:
        BinaryTree()
        {
            root = NULL;
        }

        void AddItem(T newData)
        {
            Insert(newData, root);
        }

        void PrintTree()
        {
            PrintTree(root);
        }
        T Largest()
        {
            return Largest(root);
        }
    };

    int main()
    {

        BinaryTree<int> *myBT = new BinaryTree<int>();
        myBT->AddItem(2);
        myBT->AddItem(5);
        myBT->AddItem(1);
        myBT->AddItem(10);
        myBT->AddItem(15);
        myBT->PrintTree();
        myBT->Largest();

    } 

, и вот часть, которая должна найти наибольшее число (ребенок, который находится далеко внизу):

T Largest( Node* theRoot)
{
    if ( root == NULL ){
    cout<<"There is no tree";
    return -1;
    }

    if (theRoot->rChildptr != NULL)
        return Largest(theRoot->rChildptr);
    else
        return theRoot->data;
    cout<<theRoot->data;

}; 

Ответы [ 2 ]

2 голосов
/ 19 ноября 2011

В вашем коде в Largest() есть две проблемы:

  • Похоже, вы хотели выполнить два оператора в предложении else, но вы не использовали фигурные скобки.

  • Вы хотели выполнить печать cout после возврата, что невозможно. Поменяйте порядок.

Таким образом, вы должны заменить свой фрагмент кода следующим:

    else {
        cout << theRoot->data;
        return theRoot->data;
    }

Кстати, не позволяйте двойным точкам с запятой (;;) оставаться в вашем коде. В большинстве случаев он безвреден, но всегда в плохом стиле.

0 голосов
/ 19 ноября 2011

Вот исправленная и слегка исправленная версия, которая работает:

#include <iostream>
#include <string>
#include <cstdlib> 

using namespace std;

template<class T>
class BinaryTree
{
    struct Node
    {
        T data;
        Node* lChildptr;
        Node* rChildptr;

        Node(T dataNew)
        {
            data = dataNew;
            lChildptr = 0;
            rChildptr = 0;
        }
    };

private:

    Node* root;

    void Insert(T newData, Node** theRoot)
    {
        if (*theRoot == 0)
        {
            *theRoot = new Node(newData);
        }
        else if (newData < (*theRoot)->data)
            Insert(newData, &((*theRoot)->lChildptr));
        else
            Insert(newData, &((*theRoot)->rChildptr));
    }

    void PrintTree(Node* theRoot)
    {
        if (theRoot != 0)
        {
            PrintTree(theRoot->lChildptr);
            cout << theRoot->data << " " << endl;
            PrintTree(theRoot->rChildptr);
        }
    }

    T Largest(Node* theRoot)
    {
        if (root == 0)
        {
          throw "There is no tree";
        }

        if (theRoot->rChildptr != 0)
            return Largest(theRoot->rChildptr);
        else
            return theRoot->data;
    }

public:

    BinaryTree()
    {
        root = 0;
    }

    void AddItem(T newData)
    {
        Insert(newData, &root);
    }

    void PrintTree()
    {
        PrintTree(root);
    }

    T Largest()
    {
        return Largest(root);
    }
};

int main()
{
    BinaryTree<int> *myBT = new BinaryTree<int>();

    cout << "The tree is empty. Trying to find the largest element." << endl;

    try
    {
      cout << "Largest element: " << myBT->Largest() << endl;
    }
    catch (const char* e)
    {
      cout << "Exception caught: " << e << endl;
    }

    myBT->AddItem(15);
    myBT->AddItem(2);
    myBT->AddItem(5);
    myBT->AddItem(1);
    myBT->AddItem(10);

    cout << "Tree:" << endl;
    myBT->PrintTree();

    cout << "Largest element: " << myBT->Largest() << endl;
} 

Выход:

The tree is empty. Trying to find the largest element.
Exception caught: There is no tree
Tree:
1
2
5
10
15
Largest element: 15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...