[英]In order traversal for binary search tree without node pointer as parameter
我必须在二进制搜索树中为实验室编写函数以便顺序遍历。 我的问题是,我已经得到一个必须遵循的接口,并且在其中可以传递给遍历函数的唯一参数是void返回类型的另一个函数:
void BinarySearchTree<ItemType, KeyType>::inorderTraverse(void visit(ItemType&)) const
访问函数基本上是我将为树的特定用例定义的函数,例如说我想按升序打印出树,在这种情况下,我将传递给inorderTraverse
函数的函数将是打印函数。 我无法弄清楚如何在没有节点指针作为参数的情况下遍历整个树。 我并不是在索要完整的代码,只是可以为我指明正确方向的建议! 这是BinarySearchTree.h
:
template<typename ItemType, typename KeyType>
class BinarySearchTree
{
private:
BinaryNode<ItemType>* rootPtr;
// Recursively deletes all nodes from the tree.
void destroyTree(BinaryNode<ItemType>* subTreePtr);
// 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);
// Returns a pointer to the node containing the given value,
// or nullptr if not found.
BinaryNode<ItemType>* findNode(BinaryNode<ItemType>* treePtr,
const KeyType& target) const;
public:
//------------------------------------------------------------
// Constructor and Destructor Section.
//------------------------------------------------------------
BinarySearchTree();
virtual ~BinarySearchTree();
//------------------------------------------------------------
// Public Methods Section.
//------------------------------------------------------------
bool add(const ItemType& newEntry);
ItemType getEntry(const KeyType& aKey) const throw(NotFoundException);
bool contains(const KeyType& aKey) const;
//------------------------------------------------------------
// Public Traversals Section.
//------------------------------------------------------------
void inorderTraverse(void visit(ItemType&)) const;
}; // end BinarySearchTree
#include "BinarySearchTree.cpp"
#endif
我假设BinaryNode
具有方法
const BinaryNode* getLeft() const;
const BinaryNode* getRight() const;
const ItemType& getValue() const;
[由于以下原因而被编辑:“请注意,我们无法在课程中添加任何其他内容”]
您会看到,该方法是static
-这意味着它不依赖于有关树的特定瞬间的任何知识。
因此,它可以放置在任何地方。
例如,只需将其作为静态函数写入类的"BinarySearchTree.cpp"
文件内即可。
另一个解决方案:在inorderTraverse
方法中实现它,作为lambda函数,如下所示:
// as a method of this class, you **do** have access to the root node
void inorderTraverse(void visit(const ItemType&)) const {
// this is a lambda function
auto inOrderRecurse=(
const BinaryNode<ItemType>* node,
void visit(const ItemType&)
) {
if(node) {
auto n=node->getLeft();
if(n) {
this->inOrderRecurse(n, visit);
}
visit(node->getValue());
n=node->getRight();
if(n) {
this->inOrderRecurse(n, visit);
}
}
}
;
inOrderRecurse(this->rootPtr);
}
还有另一种解决方案 :如果不允许使用lambda,则仍可以在method内部声明一个类/结构 。 因此,让我们在inorderTraverse
方法中声明/使用一个。
// as a method of this class, you **do** have access to the root node
void inorderTraverse(void visit(const ItemType&)) const {
struct recurser {
static void inOrderRecurse(
const BinaryNode<ItemType>* node,
void visit(const ItemType&)
) {
// etc...
}
};
recurser::inOrderRecurse(this->rootPtr);
}
[原始答案]
这样,可以将inorderTraverse
实现为:
private:
// "All problems in computer science can be solved by another level of indirection,
// except of course for the problem of too many indirections."
// In the context, **this method** is another level of indirection
static void inOrderRecurse(
const BinaryNode<ItemType>* node,
void visit(const ItemType&)
) const {
if(node) {
auto n=node->getLeft();
if(n) {
this->inOrderRecurse(n, visit);
}
visit(node->getValue());
n=node->getRight();
if(n) {
this->inOrderRecurse(n, visit);
}
}
public:
// as a method of this class, you **do** have access to the root node
void inorderTraverse(void visit(const ItemType&)) const {
// note this `const` here ---^ needed because of ^^^^ this one
inOrderRecurse(this->rootPtr);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.