2015-04-07 3 views
-1

Я вставив следующие элементы в бинарное дерево поиска:значение объекта заказа в бинарном дереве поиска

Mayweather,Floyd,1,105,105,0,Boxing 
Ronaldo,Cristiano,2,80,52,28,Soccer 
James,LeBron,3,72.3,19.3,53,Basketball 
Messi,Lionel,4,64.7,41.7,23,Soccer 
Bryant,Kobe,5,61.5,30.5,31,Basketball 
Woods,Tiger,6,61.2,6.2,55,Golf 
Federer,Roger,7,56.2,4.2,52,Tennis 
Mickelson,Phil,8,53.2,5.2,48,Golf 
Nadal,Rafael,9,44.5,14.5,30,Tennis 
Ryan,Matt,10,43.8,42,1.8,Football 
Pacquiao,Manny,11,41.8,41,0.8,Boxing 
Ibrahimovic,Zlatan,12,40.4,36.4,4,Soccer 
Rose,Derrick,13,36.6,17.6,19,Basketball 
Bale,Gareth,14,36.4,25.4,11,Soccer 
Falcao,Radamel,15,36.4,32.4,3,Soccer 

Где ранг первого целое число в формате CSV. И, как вы можете видеть, большинство из них уже в порядке, но не один раз они находятся в двоичном дереве поиска, и если я делаю предварительный, пост или обход на посадку, они также не в порядке.

Я пробовал множество способов, но предполагая, что нельзя использовать массив, вектор или любой другой объект - просто дерево, как это можно сделать?

void displayRank(Athlete& anItem) 
{ 
     cout << "Player: " << anItem.getRank() << endl; 
} 

void AthleteDatabase::displayByRank(void) 
{ 
    athleteDatabaseBST.preorderTraverse(displayRank); 
} 

Встроенные обходные ряды печатают ранг в случайном порядке, поскольку фамилия является ключом. Любая помощь очень ценится!

Ниже файл BinarySearchTree.h:

class BinarySearchTree : public BinaryNodeTree<ItemType> 
{ 
private: 
    BinaryNode<ItemType>* rootPtr; 

protected: 
    //------------------------------------------------------------ 
    // Protected Utility Methods Section: 
    // Recursive helper methods for the public methods. 
    //------------------------------------------------------------ 
    // Recursively finds where the given node should be placed and 
    // inserts it in a leaf at that point. 
    BinaryNode<ItemType>* insertInorder(BinaryNode<ItemType>* subTreePtr, 
             BinaryNode<ItemType>* newNode); 

    // Removes the given target value from the tree while maintaining a 
    // binary search tree. 
    BinaryNode<ItemType>* removeValue(BinaryNode<ItemType>* subTreePtr, 
            const ItemType target, 
            bool& success); 

    // Removes a given node from a tree while maintaining a 
    // binary search tree. 
    BinaryNode<ItemType>* removeNode(BinaryNode<ItemType>* nodePtr); 

    // Removes the leftmost node in the left subtree of the node 
    // pointed to by nodePtr. 
    // Sets inorderSuccessor to the value in this node. 
    // Returns a pointer to the revised subtree. 
    BinaryNode<ItemType>* removeLeftmostNode(BinaryNode<ItemType>* subTreePtr, 
              ItemType& inorderSuccessor); 

    // Returns a pointer to the node containing the given value, 
    // or nullptr if not found. 
    BinaryNode<ItemType>* findNode(BinaryNode<ItemType>* treePtr, 
            const ItemType& target) const; 

public: 
    //------------------------------------------------------------ 
    // Constructor and Destructor Section. 
    //------------------------------------------------------------ 
    BinarySearchTree(); 
    BinarySearchTree(const ItemType& rootItem); 
    BinarySearchTree(const BinarySearchTree<ItemType>& tree); 
    virtual ~BinarySearchTree(); 

    //------------------------------------------------------------ 
    // Public Methods Section. 
    //------------------------------------------------------------ 
    bool isEmpty() const; 
    int getHeight() const; 
    int getNumberOfNodes() const; 
    ItemType getRootData() const throw(PrecondViolatedExcep); 
    void setRootData(const ItemType& newData) const throw(PrecondViolatedExcep); 
    bool add(const ItemType& newEntry); 
    bool remove(const ItemType& anEntry); 
    void clear(); 
    ItemType getEntry(const ItemType& anEntry) const throw(NotFoundException); 
    bool contains(const ItemType& anEntry) const; 

    //------------------------------------------------------------ 
    // Public Traversals Section. 
    //------------------------------------------------------------ 
    void preorderTraverse(void visit(ItemType&)) const; 
    void inorderTraverse(void visit(ItemType&)) const; 
    void postorderTraverse(void visit(ItemType&)) const; 

    //------------------------------------------------------------ 
    // Overloaded Operator Section. 
    //------------------------------------------------------------ 
    BinarySearchTree<ItemType>& operator=(const BinarySearchTree<ItemType>& rightHandSide); 
}; // end BinarySearchTree 
+1

Структура дерева определяется ключом. Если вы хотите пройти в ранговом порядке, используйте ранг как ключ. – molbdnilo

+0

@molbdnilo Я согласен, но как мне это сделать, кроме изменения файла? –

+0

Не должно быть причин для изменения ввода, если реализация разумна. Детали будут зависеть от вашей реализации дерева, о которой мы ничего не знаем. – molbdnilo

ответ

1

Если вы не можете сбросить содержимое дерева в вектор и сортировать вектор на разных полях, я полагаю, вы можете попробовать следующее:

Шаг 1: найдите, сообщите и сохраните копию самого маленького элемента на основе нового поля сортировки. (поиск по всему дереву)

Шаг 2 (и последующий): найдите, сообщите и сохраните копию самого маленького элемента, который также больше, чем предыдущий наименьший элемент. (поиск по всему дереву)

Не очень эффективен, но я думаю, вы должны быть в состоянии сделать эту работу.

Удачи.

+0

@inquisitor - вам нужно обрабатывать несколько минимумов. Поэтому я предлагаю вам разделить оба шага: 1a. - найти минимальный (поиск всего дерева), 1б. - сообщать каждому узлу, который соответствует этому минимуму (поиск всего дерева), и аналогичный 2 проход для шага 2. –