Ik heb de uitvoering van een koppeling op basis van BST (binaire zoekboom) in C ++ voor één van mijn opdracht. Ik heb mijn hele klas geschreven en alles werkt goed, maar mijn opdracht vraagt me om de doorlooptijden te plotten voor:
a. A sorted list of 50000, 75000, and 100000 items
b. A random list of 50000, 75000, and 100000 items
Dat is prima, kan ik de nummers in te lassen, maar het vraagt me ook om de bellen FindHeight()en CountLeaves()methoden op de boom. Mijn probleem is dat ik de twee functies heeft geïmplementeerd met behulp van recursion. Aangezien ik een zo'n grote lijst van nummers Ik krijg steeds een stackoverflowuitzondering.
Hier is mijn definitie van de klasse:
template <class TItem>
class BinarySearchTree
{
public:
struct BinarySearchTreeNode
{
public:
TItem Data;
BinarySearchTreeNode* LeftChild;
BinarySearchTreeNode* RightChild;
};
BinarySearchTreeNode* RootNode;
BinarySearchTree();
~BinarySearchTree();
void InsertItem(TItem);
void PrintTree();
void PrintTree(BinarySearchTreeNode*);
void DeleteTree();
void DeleteTree(BinarySearchTreeNode*&);
int CountLeaves();
int CountLeaves(BinarySearchTreeNode*);
int FindHeight();
int FindHeight(BinarySearchTreeNode*);
int SingleParents();
int SingleParents(BinarySearchTreeNode*);
TItem FindMin();
TItem FindMin(BinarySearchTreeNode*);
TItem FindMax();
TItem FindMax(BinarySearchTreeNode*);
};
FindHeight () Uitvoering
template <class TItem>
int BinarySearchTree<TItem>::FindHeight()
{
return FindHeight(RootNode);
}
template <class TItem>
int BinarySearchTree<TItem>::FindHeight(BinarySearchTreeNode* Node)
{
if(Node == NULL)
return 0;
return 1 + max(FindHeight(Node->LeftChild), FindHeight(Node->RightChild));
}
CountLeaves () implementatie
template <class TItem>
int BinarySearchTree<TItem>::CountLeaves()
{
return CountLeaves(RootNode);
}
template <class TItem>
int BinarySearchTree<TItem>::CountLeaves(BinarySearchTreeNode* Node)
{
if(Node == NULL)
return 0;
else if(Node->LeftChild == NULL && Node->RightChild == NULL)
return 1;
else
return CountLeaves(Node->LeftChild) + CountLeaves(Node->RightChild);
}
Ik heb geprobeerd om te bedenken hoe ik de twee methoden zonder recursie kan implementeren, maar ik ben helemaal stumped. Iemand enig idee?













